바이트 스트림
은 이미지, 동영상, 오디오, 텍스트 등 모든 형태의 데이터를 입출력할 수 있는 스트림입니다.
OutputStream
은 바이트 출력 스트림의 최상위 클래스이자 추상 클래스입니다. 이 클래스 아래에 다양한 출력에 대비한 FileOutputStream
, PrintStream
, BufferedOutputStream
, DataOutputStream
이 자식 클래스로 존재하고 있습니다.
OutputStream
클래스에서는 바이트 출력 스트림에서 공통적으로 사용되는 메소드들을 정의하고 있습니다.
메소드 | 설명 |
---|---|
write(int b) | 1 byte 출력 |
write(byte[] b) | 배열 b의 모든 바이트 출력 |
write(byte[] b, int off, int len) | 배열 b의 off부터 len개의 바이트 출력 |
flush() | 출력 버퍼에 잔류한 모든 바이트 출력 |
close() | 출력 스트림을 닫고 메모리 해제 |
다음 코드는 FileOutputStream
을 이용해서 바이트를 저장하는 예제입니다.
public class Main {
public static void main(String[] args) throws IOException {
OutputStream outputStream = new FileOutputStream("data.db");
byte x = 1;
byte y = 2;
byte z = 3;
outputStream.write(x);
outputStream.write(y);
outputStream.write(z);
outputStream.flush();
outputStream.close(); //스트림 종료와 메모리 해제
}
}
이 코드를 실행하면 프로젝트 파일 내에 data.db
라는 파일이 하나 생성되었을 것입니다. 이 문자들은 데이터 통신에서 사용되는 통신 제어 문자
로 SOH
는 데이터 헤더의 시작을 알리고, STX
는 텍스트의 시작, ETX
는 텍스트의 종료를 알리는 의미를 가지고 있습니다.
FileOutputStream 생성자
가 파일 생성에 실패하거나 write(), flush(), close()
메소드는 IOException
예외를 발생시킬 수 있기 때문에 예제에서는 생략했지만 예외처리 구문을 작성할 필요가 있습니다.
입출력으로
FileOutputStream, FileInputStream
만을 다루지만 나머지 종류의 스트림에서도 읽고 쓰기에 대한 방식은 동일합니다.
InputStream
은 바이트 입력 스트림의 최상위 클래스이자 추상 클래스입니다. 마찬가지로 다양한 입력에 대비해 FileInputStream
, BufferedInputStream
, DataInputStream
을 자식 클래스를 가지고 있습니다.
마찬가지로 InputStream
클래스도 입력 스트림에서 공통적으로 사용되는 메소드들을 가지고 있습니다.
메소드 | 설명 |
---|---|
int read() | 1 byte를 읽고 해당 바이트 반환 |
int read(byte[] b) | 읽은 바이트를 배열 b에 저장하고 읽은 바이트 개수 리턴 |
void close() | 입력 스트림을 닫고 메모리 해제 |
다음 코드는 방금 출력 스트림을 하면서 만들었던 data.db
를 읽어내는 예제입니다.
public class Main {
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("test.db");
while(true) {
int data = inputStream.read();
if (data == -1) { //파일 끝에 도달하면 반복 탈출
break;
}
else {
System.out.println(data);
}
}
inputStream.close(); //읽기 스트림을 닫고 메모리 해제
}
}
조금 전에 저장한 값들이 제대로 저장되었고 잘 읽었죠?
FileInputStream 생성자
는 읽고자하는 파일이 없는 경우 FileNotFoundException
예외를 발생시키며, read(), close()
메소드는 IOException
을 발생시킬 수 있어서 실제로 사용할 때는 예외 처리 구문도 사용하는 것이 좋습니다.