입력과 출력

msung99·2022년 2월 15일
0


스트림(stream)

  • 프로그램에서 입/출력 대상이 있으면 입/출력을 할 수 있다.
    이떄 데이터가 오고 가는 길을 스트림(stream) 이라고 한다.

입/출력 기본 클래스

  • InputStream, OutputStream

    • 입/출력에 사용되는 기본 클래스. 1byte 단위로 데이터를 전송하는 기본 클래스이다

    • 입력 대상을 프로그램에 입력시에는 InputStream 을 이용한다.

    • 출력 대상을 프로그램에서 출력할시에는 OutputStream 을 이용한다.


InputStream, OutputStream 의 계층 구조

  • InputStream 의 하위 클래스

    • FileInputStream
    • DataInputStream
    • BufferedInputStream
  • Outputstream 의 하위 클래스

    • FileOutputStream
    • DataOutputStream
    • BufferedOutputStream

FileInputStream, FileOutputStream

파일에 데이터를 읽고/쓰기 위한 클래스

객체 생성 형식
파일 객체명 = new FileInputStream("읽어올 해당 파일 경로");
파일 객체명 = new FileOutputStream("출력할 해당 파일 경로"); // 파일이 없으면 새롭게 생성하고 거기에다 출력

FileInputStream 의 메소드 - read

  • read(); // 1바이트씩 파일에서 읽어옴
  • read(byte[ ]); // 배열 크기 [ ] 만큼 파일에서 읽어옴
// 파일에 "Hello Java" 라고 저장되어 있다고 가정하자.

// CASE1
data1 = inputstream.read(); // 1바이트 단위로 파일에서 읽어옴
print(data1); // "H" 출력


// CASE2
byte[] bs2 = new byte[3];

data2 = inputstream.read(bs2); // 3바이트 단위로 읽어옴
print(data2) "Hel" 출력

FileOutputStream 의 메소드 - write

  • write(byte[ ] b); // 전체 쓰기 - 파일에 출력하고자 하는 것을 배열로 묶어서 던지면 한번에 쓰게됨

  • write( byte[ ] , int off , int len ); // off(시작점), len(길이) - 배열에서 시작점 off에서부터 특정 길이 len 만큼만 파일에 출력함

// CASE1
String data2 = "Hello Java";
byte[] arr = data1.getBytes();

outputstream.write(arr); // "Hello Java" 를 파일에 쓴다

// CASE2
String data2 = "MY World Java";
byte[] arr = data2.getBytes();

outputstream.write(arr,1,5); // "Y Wor" 을 파일에 쓴다

예제 - read() 메소드 1바이트 단위로 읽어오기

InputStream inputstream  = null;
try{
  inputStream = new FileInputStream("C:\\java\\pjt_ex\\hello.txt");
  int data = 0;
  
  while(true){
    try{
      data = inputStream.read(); // 1바이트씩 계속 읽어옴
      
    }catch(IOException e){ // 더이상 파일에서 읽어올게 없는데 
                          // 읽어오려고 하면 애러가 발생 하므로
    
      e.printStackTrace(); // 애러 매시지 출력함
    }
    // 파일에 끝에는 -1 이 담겨져 있음
    if (data == -1) break; // 파일의 끝이라면 while 문을 break한다
    System.out.println("data:" + data);
  }
  
} catch (FileNotFoundException e) { // 해당하는 파일이 없으면
  
   e.printStackTrace(); // 애러 매시지 출력함
} finally{
      try{
          // 파일 스트림 객체는 마지막에 close() 로 종료시켜 줘야함
          if(inputStream != null) inputstream.close(); 
      } catch(IOException e) {
        e.printStackTrace();
      }
}

예제 - read() 메소드 지정한 배열 크기 단위로 읽어오기

InputStream inputstream  = null;
try{
  inputStream = new FileInputStream("C:\\java\\pjt_ex\\hello.txt");
  int data = 0;
  byte[] bs = new byte[3]; // 3 바이트 배열 단위로 파일에서 묶음으로 읽어오기 위해 선언한 배열
  
  while(true){
    try{
      data = inputStream.read(bs); // 선언한 배열을 read() 의 인자로 넘겨줌.
      // 이제 3바이트 단위로 파일에서 읽어올거임.
      
    }catch(IOException e){
    
      e.printStackTrace(); 
    }
    
    if (data == -1) break; 
    System.out.println("data:" + data);
    
    // 제대로 읽어오는지 출력해봄 
    for (int i=0; i < bs.length; i++){
      System.out.println("bs[" i + "] :" + bs[i]);
    }
  }
  
} catch (FileNotFoundException e) { 
  
   e.printStackTrace();
} finally{
      try{
          if(inputStream != null) inputstream.close(); 
      } catch(IOException e) {
        e.printStackTrace();
      }
}

예제 - OutputStream( )

OutputStream outputstream  = null;
try{
  outputStream = new FileInputStream("C:\\java\\pjt_ex\\hello.txt");
  String data = "Hello java World!";
  byte[] arr = data.getBytes(); // getBytes() : 바이트 단위로 전환
  
  try{
      outputStream.write(arr,0,5); // "Hello" 를 파일에 출력한다. 
      
    }catch(IOException e){
    
      e.printStackTrace(); 
    }   
  } catch (FileNotFoundException e){
    e.printStackTrace();
  
  } finally{
      try{
          if(inputStream != null) inputstream.close(); 
      } catch(IOException e) {
        e.printStackTrace();
      }
}

DataInputStream, DataOutputStream

bytes 단위의 입출력을 개선해서 문자열을 좀 더 편리하게 다룰 수 있다.

  • DataOutputStream

    • 자바의 기본 데이터 타입별로 출력하는 별도의 메소드가 존재함
  • DataInputStream

    • 파일에 바이너리 형태로 입력했던 바이너리 타입 데이터를 다시 원래 타입으로 읽어옴
String str1 = "Hello java world!";
OutputStream outputStream = null;
DataOutputStream dataOutputStream = null;

try{

// FileOutputStream 객체인 outputSteam 을 이용해 바이너리 타입으로 데이터를 파일에 출력
  outputStream = new FileOutputStream("C:\\java\\pjt_ex\\hello.txt");

// outputStreem 을 인자로 주어서 바이트 타입을 본래 타입(문자열) 로 변경해서 출력 
  dataOutputStream = new DataOutputStream(outputStream);
  
  dataOutputStream.writeUTF(str); // 
  
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    try {
      if (dataOutputStream != null) dataOutputStream.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
    try{
      if (outputStream != null) outputStream.close();
    } catch (Exception e) {
      e.printStackTrace();
    }

BufferedReader, BufferedWriter

  • 문자 단위로 읽어들임
profile
블로그 이전 : https://haon.blog

0개의 댓글