✔️ 모든 바이트기반 보조스트림의 최고조상
protected FiterInputStream(InputStream in)
public FilterOutputStream(OutputStream out)
FilterInputStream
/ FilterOutputStream
의 read()
와 write()
를 원하는 기능대로 오버라이딩해야 한다.❗️ FilterInputStrema의 자손
- BufferedInputStream
- DataInputStream
- PushbackInputStream
❗️ FilterOutputStream의 자손
- BufferedOutputStream
- DataOutputStream
- PrintStream
✔️ 입출력 효율을 높이기 위해 버퍼(byte[])를 사용하는 보조스트림
프로그램에서 버퍼에 저장된 모든 데이터를 다 읽고 그 다음 데이터를 읽기위해 read()
가 호출되면, BufferedInputStream
은 입력소스로부터 다시 버퍼크기 만큼의 데이터를 읽어다 버퍼에 저장해 놓는다.
이와 같은 작업이 계속해서 반복된다.
BufferedOutputStream
역시 프로그램에서 write()
를 이용한 출력이 버퍼에 저장된다.
버퍼가 가득차면, 그 때 버퍼의 모든 내용을 출력소스에 출력한다. 그리고는 버퍼를 비우고 다시 프로그램으로부터의 출력을 저장할 준비를 한다.
❗️ BufferedOutputStream의
close()
는flush()
를 호출하여 버퍼의 내용을 출력스트림에 쓰도록 한 후, BufferedOutputStream인스턴스의 참조변수에 null을 지정함으로써 사용하던 자원들이 반환되게 한다.
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedOutputStreamEx1 {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("123.txt");
// BufferOutputStream의 버퍼 크기를 5로한다.
BufferedOutputStream bos = new BufferedOutputStream(fos, 5);
// 파일 123.txt에 1부터 9까지 출력한다.
for(int i = '1'; i <= '9'; i++) {
bos.write(i); // 1, 2, 3, 4, 5
}
fos.close();
} catch (IOException e ) {
e.printStackTrace();
}
}
}
1, 2, 3, 4, 5
버퍼에 남아있는 데이터가 출려되지 못한 상태로 프로그램이 종료되었기 때문에 5까지만 출력된 것을 알 수 있다.
bos.close()
를 해주면 전체가 다 나온다.BufferedOutputStream의 close()
는 기반 스트림인 FileOutputStream의 close()
를 호출하기 때문에 FileOutputStream의 close()
는 따로 호출해주지 않아도 된다.
❗️ 보조 스트림의 close()만 호출하면 된다
References
: https://cafe.naver.com/javachobostudy