[Java] 자바 파일 입출력 Binary File I/O - 바이너리 스트림 클래스


Binary File I/O - 바이너리 스트림 클래스

 - 바이트 스트림 (byte stream 또는 binary Stream) : 

   중간에 변경없이 바이트 단위 그대로 읽고 쓰는 클래스들.

 

- 상속 계층 구조

   InputStream

1) Data Sink Stream 클래스 (데이터를 직접 읽고/쓰는 클래스)

-> FileInputStream - read(), read(byte[]), read(byte[], offset, length)

-> ByteArrayInputStream

-> PipedInputStream


2) Data Processing Stream 클래스 (중간에서 데이터 가공)

-> BufferedInputStream

-> DataInputStream

-> ObjectInputStream


   OutputStream

1) Data Sink Stream 클래스 (데이터를 직접 읽고/쓰는 클래스)

-> FileOutputSteam - write(int), write(byte[]), write(byte[], offset, length)

-> ByteArrayOuputStream

-> PipedOutputStream


2) Data Processing Stream 클래스 (중간에서 데이터 가공)

-> BufferedOutputStream

-> DataOutputStream

-> ObjectOutputStream

-> PrintStream





1-1. FileOutputSteam 예제 



import java.io.FileOutputStream;
public class Test02_1 {
  public static void main(String[] args) throws Exception {
    // 1) FileOutputStream 객체 생성
    FileOutputStream out = new FileOutputStream("test02_1.data");
   
    // write(int) => 무조건 끝 1바이트만 출력
    out.write(0x66778899);
    out.write(0x77665544);
    out.write(0x12345678);
   
    // 출력 스트림을 다 사용했으면 파일을 닫아라
    // => 파일을 다루기 위해 준비했던 메모리를 해제시킨다.
    // => OS 파일 시스템과의 연결도 끊는다.
    out.close();
   
  }

}


- 실행 결과 : 

root 폴더에 "test02_1.data"파일이 생성된 것을 알 수 있다. 

또한 write()를 호출해 넘겨준 아규먼트 값이 들어간 것을 확인할 수 있다.



1-2. FileInputStream 예제



 public static void main(String[] args) throws Exception {
    // 1) FileOutputStream 객체 생성
    FileInputStream in = new FileInputStream("test02_1.data");
   
    // read(int)
    // => 무조건 끝 1바이트만 읽는다.
    // => 하지만 리턴 타입이 int이기 때문에 int 타입 변수로 값을 받아야 한다.
    int b = in.read();
    System.out.printf("%x ", b);
    b = in.read();
    System.out.printf("%x ", b);
    b = in.read();
    System.out.printf("%x ", b);
  
    // 입력 스트림을 다 사용했으면 파일을 닫아라
    // => 파일을 다루기 위해 준비했던 메모리를 해제시킨다.
    // => OS 파일 시스템과의 연결도 끊는다.
    in.close();
   
  }

}


- 실행 결과 :

99 44 78





2-1. FileOutputSteam 예제 



import java.io.FileOutputStream;


public class Test02_3_out {
  public static void main(String[] args) throws Exception {
    // 1) FileOutputStream 객체 생성
    FileOutputStream out = new FileOutputStream("test02_3.data");
   
    byte[] bytes = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
    out.write(bytes, 2, 3); // 바이트 배열에서 2번 방부터 3개 출력
   
    out.close();
    System.out.println("파일 출력 완료!");
   
  }

}

- 실행 결과 : 

root 폴더에 "test02_3.data"파일이 생성된 것을 알 수 있다. 

또한 write()를 호출해 넘겨준 아규먼트 값이 들어간 것을 확인할 수 있다.




2-2. FileInputSteam 예제 



public class Test02_3_in {

  public static void main(String[] args) throws Exception {
    // 1) FileOutputStream 객체 생성
    FileInputStream in = new FileInputStream("test02_3.data");
   
    // 바이트 배열을 저장할 메모리를 준비한다.
    byte[] bytes = new byte[1024]; // heap에 만들어지는 것은 0으로 자동 초기화된다.
    int len = 0;
   
    // read(배열주소, offset, length)
    // => 배열주소: 데이터를 저장할 배열
    // => offset: 저장할 위치(index: 0부터 ~)
    // => length: '희망'하는 읽기 개수
    // => 리턴값: 실제 읽은 바이트 수
    len = in.read(bytes, 5, 2);
   
    for (int i = 0; i < 10; i++) {
      System.out.printf("%x ", bytes[i]);
    }
    in.close();
  }
}

- 실행 결과 :

0 0 0 0 0 33 44 0 0 0 2




블로그 이미지

필로그래머

,