- 입출력 스트림
java.io 패키지에는 여러 종류의 스트림 클래스를 제공하고 있다. 스트림 클래스는 다음과 같이 크게 두 종류로 구분된다.
바이트 기반 스트림: 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용
문자 기반 스트림: 문자 데이터를 읽고 출력할 때 사용
바이트 기반 스트림 | 문자 기반 스트림 | |||
입력 스트림 | 출력 스트림 | 입력 스트림 | 출력 스트림 | |
최상위 클래스 | InputStream | OutputStream | Reader | Writer |
하위 클래스 (예) |
XXXInputStream (FileInputStream) |
XXXOutputStream (FileOutputStrema) |
XXXReader (FileReader) |
XXXWriter (FileWriter) |
- flush() : 출력 버퍼에 잔류하는 모든 바이트, 문자를 출력한다. 출력 스트림은 출력할 바이트나 문자를 바로 보내는 것이 아니라 내부 버퍼에 우선 저장해놓기 때문에 flush() 메소드로 버퍼에 잔류하는 바이트나 문자를 내보내야 한다.
- close() : 해당 스트림을 닫는다.
- 보조 스트림
기본 스트림인 InputStream/OutputStream, Reader/Writer를 직접 사용해서 데이터를 입출력할 수 있지만, 보조 스트림을 연결하여 여러 가지 편리한 기능들을 수행할 수 있다. 보조 스트림은 자체적으로 입출력을 수행할 수 없기 때문에 입출력 소스와 바로 연결되는 기본 스트림에 연결해서 입출력을 수행한다.
① 데이터를 변환해서 입출력하거나 데이터의 출력 형식을 지정하고 싶을 경우
② 입출력 성능을 향상시키고 싶을 경우
이 경우에는 기본 스트림에 보조 스트림을 연결하여 사용하면 편리하게 문자 변환, 입출력 성능 향상, 기본 타입 입출력 등의 기능을 사용할 수 있다.
프로그램은 입력 스트림으로부터 직접 데이터를 읽지 않고 보조 스트림에서 제공하는 기능을 이용해서 데이터를 읽는다. 반대로 출력 스트림으로 직접 데이터를 보내지 않고 보조 스트림에서 제공하는 기능을 이용해 데이터를 보낸다.
- 보조 스트림 연결하기
보조 스트림을 연결하려면 보조 스트림을 생성할 때 자신이 연결될 스트림을 다음과 같이 생성자의 매개값으로 제공하면 된다.
보조스트림 변수 = new 보조스트림(연결스트림);
보조 스트림의 생성자 매개값은 InputStream/OutputStream, Reader/Writer 이외에 또 다른 보조 스트림이 될 수 있다. 보조 스트림을 연속적으로 연결할 수 있다는 뜻이다. 예를 들어 다음과 같이 문자 변환 보조 스트림인 InputStreamReader를 다시 성능 보조 스트림인 BufferedReader에 연결할 수 있다.
InputStream is = System.in;
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
- 문자 변환 보조 스트림
소스 스트림이 바이트 기반 스트림(InputStream, OuputStream, FileInputStream, FileOutputStream)이면서 입출력 데이터가 문자라면 Reader와 Writer로 변환해서 사용하는 것을 고려할 수 있다. 문자 입출력은 Reader와 Writer가 편리하기 때문이다.
OutputStreamWriter
OutputStreamWriter는 바이트 기반 출력 스트림에 연결되어 문자 출력 스트림인 Writer로 변환하는 보조 스트림이다.
Writer writer = new OutputStreamWriter(바이트 기반 출력 스트림);
InputStreamReader
InputStreamReader는 바이트 기반 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환하는 보조 스트림이다.
Reader reader = new InputStreamReader(바이트 기반 입력 스트림);
- 성능 향상 보조 스트림 (★)
프로그램의 실행 성능은 입출력이 가장 늦은 장치를 따라간다. 이는 완전히 해결될 수는 없지만 프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업함으로써 실행 성능을 향상시킬 수 있다. 기본적으로 출력 스트림은 내부에 작은 버퍼를 가지고 있지만 이것으로는 불충분하기 때문이다.
BufferedOutputStream과 BufferedWriter
BufferedOutputStream은 바이트 기반 출력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림이고, BufferedWriter는 문자 기반 출력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림이다. BufferedOutputStream과 BufferedWriter는 프로그램에서 전송한 데이터를 내부 버퍼에 쌓아두었다가 버퍼에 꽉 차면, 버퍼의 모든 데이터를 한꺼번에 보낸다. 메모리 버퍼로 데이터를 고속 전송하기에 출력 성능이 향상되는 효과를 얻게 된다.
BufferedOutputStream과 BufferedWriter 보조 스트림은 다음과 같이 생성자의 매개값으로 준 출력 스트림과 연결되어 추가적인 내부 버퍼를 제공한다.
BufferedOutputStream bos = new BufferedOutputStream(바이트 기반 출력 스트림);
BufferedWriter bw = new BufferedWriter(문자 기반 출력 스트림);
BufferedInputStream과 BufferedReader
BufferedInputStream은 바이트 기반 입력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림이고, BufferedReader는 문자 기반 입력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림이다. BufferedInputStream과 BufferedReader는 입력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장해둔다. 프로그램은 외부의 입력 소스로부터 직접 읽는 대신 버퍼로부터 읽음으로써 읽기 성능이 향상된다.
BufferedInputStream과 BufferedReader 보조 스트림은 다음과 같이 생성자의 매개값으로 준 입력 스트림과 연결되어 추가적인 내부 버퍼를 제공한다.
BufferedInputStream bis = new BufferedInputStream(바이트 기반 입력 스트림);
BufferedReader br = new BufferedReader(문자 기반 입력 스트림);
BufferedReader는 라인 단위로 문자열을 읽는 매우 편리한 readLine() 메소드를 제공한다. readLine()은 Enter 키('\r' + '\n') 이전의 모든 문자열을 읽고 리턴한다. 이 메소드를 사용하면 키보드에서 입력한 내용 및 파일 내용을 라인 단위로 읽을 수 있다.
라인 단위로 문자열을 얻고 싶다면 BufferedReader 보조 스트림을 생성하고 readLine()으로 반복해서 읽으면 된다. 더 이상 읽을 라인이 없다면 readLine()은 null을 리턴한다.
...
BufferedReader br = new BufferedReader(reader);
while(true) {
String data = br.readLine(); // 라인 단위 문자열 읽고 리턴
if(data == null) break; // 파일 끝에 도달했을 경우
System.out.println(data);
}
br.close();
- 프린터 보조 스트림
PrintStream ps = new PrintStream(바이트 기반 출력 스트림);
PrintWriter pw = new PrintWriter(문자 기반 출력 스트림);
>> PrintStream의 println() 메소드로 출력한 내용은 BufferedReader의 readLine()으로 읽으면 매우 편리하다. println() 메소드는 '\n'을 포함하고 출력하므로 readLine() 메소드가 개행 문자 앞까지 쉽게 읽을 수 있기 때문이다.
'Java > 자바 문법 정리' 카테고리의 다른 글
[Java] +82-기본편-정리하기 : 상속 편 (0) | 2023.01.16 |
---|---|
[Java] +82-기본편-정리하기 : 클래스 편 (1) | 2023.01.07 |
[Java] +82-기본편-정리하기 : 언어의 기초 (0) | 2023.01.06 |