자바에서 입출력하기 위해선 Stream 클래스를 사용하자. (14장의 스트림과 다름)
스트림이란, 데이터를 운반하는 데 사용되는 연결통로이다.
스트림은 단방향 통신만 가능하다. 따라서 입출력 모두 각각의 스트림이 존재한다.
바이트 단위로 데이터를 전송한다.
대표적인 예로 FileInputStream/OutputStream가 있다.
InputStream은 read()
, read(byte[] b)
, read(byte[] b, int off, int len)
만 잘 사용해도 된다. 여기서 주의할 점은, read()
은 추상 메서드이다. 따라서 본 메서드를 목적에 맞게끔 구현해야 한다.
스트림을 보조하기 위한 스트림이다.
대표적인 예로, BufferedInputStream이 있다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("text.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedInputStream.read();
}
}
버퍼를 사용한 입출력과 사용하지 않은 것은 상당한 성능 차이를 보인다.
가능한 버퍼를 사용한 입출력을 수행하자.
java에서의 문자형인 char형은 2byte이다.
따라서 1byte 단위의 바이트 기반 스트림을 사용해 문자열을 처리하는 데는 어려움이 있다.
이를 극복하기 위해 문자기반 스트림이 존재한다.
InputStream
=> Reader
, OutputStream
=> Writer
로 각각 대응한다.
예로, FileInputStream
=> FileReader
가 된다.
사용법은 바이트기반 스트림과 동일하다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("test.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
for (;;) {
int read = bufferedReader.read();
if (read == -1) {
break;
}
System.out.print((char) read);
}
bufferedReader.close();
fileReader.close();
}
}
보조 스트림 마찬가지로 바이트기반 스트림의 보조 스트림과 별 차이 없다.