자바에서의 I/O는 입출력 순서가 있는 일련의 데이터인 스트림을 통해 이루어지며, 스트림 클래스에 바탕을 둔 I/O 기능을 위해 java.io
라는 패키지를 제공하고 있습니다.
여기에 바이트 단위 입출력 스트림 최상위 추상 클래스인 InputStream/OutputStream은 데이터를 읽어오거나 출력하는 메서드들이 선언되어 있습니다.
InputStream은 모든 입력 스트림 클래스의 상위 클래스로 입력에 관련된 기본적인 메서드들을 제공하고 있습니다.
InputStream의 주요 하위 클래스는 다음과 같습니다.
스트림 클래스 | 설명 |
---|---|
FileInputStream | 파일에서 바이트 단위로 자료를 읽습니다 |
ByteArrayInputStream | byte 배열 메모리에서 바이트 단위로 자료를 읽습니다. |
FilterInputStream | 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스 |
이러한 InputStream에는 이런 메서드들을 가지고 있습니다.
메서드 | 설명 |
---|---|
int read() | 입력 스트림으로부터 한 바이트의 자료를 읽습니다. 읽은 자료의 바이트 수를 반환합니다. |
int read(byte b[]) | 입력 스트림으로 부터 b[] 크기의 자료를 b[]에 읽습니다. 읽은 자료의 바이트 수를 반환합니다. |
int read(byte b[], int off, int len) | 입력 스트림으로 부터 b[] 크기의 자료를 b[]의 off변수 위치부터 저장하며 len 만큼 읽습니다. 읽은 자료의 바이트 수를 반환합니다. |
void close() | 입력 스트림과 연결된 대상 리소스를 닫습니다. |
OutputStream은 모든 출력 스트림 클래스의 상위 클래스로 출력에 관련된 기본적인 메서드들을 제공하고 있습니다.
OutputStream의 주요 하위 클래스는 다음과 같습니다.
스트림 클래스 | 설명 |
---|---|
FileOutputStream | 파일에서 바이트 단위로 자료를 씁니다. |
ByteArrayOutputStream | byte 배열 메모리에서 바이트 단위로 자료를 씁니다. |
FilterOutputStream | 기반 스트림에서 자료를 쓸 때 추가 기능을 제공하는 보조 스트림의 상위 클래스 |
이러한 OutputStream에는 이런 메서드들을 가지고 있습니다.
메서드 | 설명 |
---|---|
int write() | 한 바이트를 출력합니다 |
int write(byte b[]) | b[] 크기의 자료를 출력합니다 |
int write(byte b[], int off, int len) | b[] 배열에 있는 자료의 off 위치부터 len 개수만큼 자료를 출력합니다. |
void flush() | 출력을 위해 잠시 자료가 머무르는 출력 버퍼를 강제로 비워 자료를 출력합니다. |
void close() | 출력 스트림과 연결된 대상 리소스를 닫습니다. 출력 버퍼가 비워집니다. |
FileInputStream 클래스는 파일로부터 데이터를 읽기 위해 사용됩니다. 생성자가 호출될 때 파일을 열 수 없으면 예외(FileNotFoundException)가 발생하기 때문에 항상 try-catch 문을 사용하여 예외가 발생할 상황을 대비해야 합니다.
FileInputStream은 "ABC"라는 내용이 입력된 input.txt
파일이 존재할 때, 아래와 같이 파일 내용 끝까지 한 바이트씩 데이터를 읽을 수 있습니다.
public class FileInputStreamTest {
public static void main(String[] args) {
try(FileInputStream fis = new FileInputStream("input.txt")){
int i;
while ( (i = fis.read()) != -1){
System.out.println((char)i);
}
System.out.println("end");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
결과
ABC
FileOutStream 클래스는 FileInputStream과 유사하며, 데이터를 파일에 저장하기 위해 사용되어지는 클래스입니다.
이러한 클래스들의 메서드들은 파일에 대하여 동작한다는 것을 제외하면 InputStream이나 OutputStream 클래스와 같다고 볼 수 있습니다.
output.txt
파일에 "ABC"를 한 바이트씩 쓰는 코드는 다음과 같습니다.
public class FileOutputStreamTest {
public static void main(String[] args) {
try(FileOutputStream fos = new FileOutputStream("output.txt")){
fos.write(65); //A
fos.write(66); //B
fos.write(67); //C
}catch(IOException e) {
e.printStackTrace();
}
System.out.println("출력이 완료되었습니다.");
}
}
결과
출력이 완료되었습니다.
파일에 정상적으로 쓰여졌다면 콘솔에 출력이 완료되었습니다.
라고 출력되며, output.txt
파일에 "ABC"라는 글자가 저장된 것을 확인할 수 있을 것입니다.
ByteArrayInputStream & ByteArrayOutputStream은 바이트 배열을 입력 스트림의 입력 대상이나 출력 스트림의 출력 대상으로 사용하는 클래스입니다.
이 클래스들의 메서드들은 배열에 대하여 동작한다는 것을 제외하면 역시 InputStream과 OutputStream 클래스와 같습니다.
ByteArrayInputStream에서, 입력의 대상이 되는 바이트 배열은 생성자의 매개변수로 지정하고 ByteArrayOutputStream 클래스에서, 버퍼의 크기를 생성자의 매개변수로 줄 수 있습니다.
FilterInputStream & FilterOutputStream은 데이터를 읽거나 쓸 때 값을 수정하는 작업을 부가적으로 할 수 있는 메서드들을 갖고 있는 클래스입니다.
이상으로 자바에서 사용하는 바이트 단위 입출력 스트림에 대해서 간단하게 알아봤습니다.