Java BufferedOutputStream: 효율적 바이트 쓰기 완벽 해설
Java BufferedOutputStream: 효율적 바이트 쓰기 완벽 해설
명확한 설명과 실전 코드 스니펫을 통해 BufferedOutputStream 클래스의 설계, 사용법, 핵심 메서드를 마스터하세요.
java.io 패키지의 BufferedOutputStream 클래스는 다른 OutputStream을 래핑하여 바이트 수준 출력을 가속화합니다. 데이터를 메모리에 버퍼링하여 기본 장치에 대한 쓰기 연산 횟수를 줄임으로써, 특히 큰 파일의 경우 성능을 크게 향상시킬 수 있습니다.
추상 OutputStream 클래스를 상속하며 그 메서드들의 구체적 구현을 제공합니다.
BufferedOutputStream 작동 원리
스트림은 기본적으로 8KiB(8,192바이트) 버퍼를 내부적으로 할당합니다. write()가 호출되면 바이트는 먼저 이 버퍼에 저장됩니다. 버퍼가 가득 차거나 flush() 또는 close()가 호출될 때만 데이터가 기본 스트림으로 플러시됩니다.
디스크 I/O는 비용이 많이 들기 때문에 이 버퍼링 전략은 왕복을 줄이고 바이트 쓰기를 상당히 빠르게 만듭니다.
BufferedOutputStream 생성하기
클래스를 임포트하고 일반적으로 FileOutputStream인 OutputStream을 래핑합니다:
FileOutputStream file = new FileOutputStream("output.txt");
BufferedOutputStream buffer = new BufferedOutputStream(file);
버퍼 크기를 제어하려면 두 번째 인수를 제공합니다:
BufferedOutputStream buffer = new BufferedOutputStream(file, 16384); // 16 KiB 버퍼
더 큰 버퍼는 매우 큰 쓰기에 유리할 수 있지만, 기본 8KiB가 대부분의 시나리오에 적합합니다.
BufferedOutputStream의 핵심 메서드
이 클래스는 버퍼링 지원을 갖춘 OutputStream의 전체 메서드 세트를 구현합니다.
write()
write(int b) - 단일 바이트를 버퍼에 추가합니다.
write(byte[] b) - 전체 바이트 배열을 씁니다.
write(byte[] b, int off, int len) - off 오프셋부터 len 바이트를 씁니다.
예제: 텍스트를 파일에 쓰기
import java.io.*;
public class Main {
public static void main(String[] args) {
String data = "This is a line of text inside the file";
try (FileOutputStream fos = new FileOutputStream("output.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos)) {
bos.write(data.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
이 프로그램을 실행하면 output.txt가 생성되며 다음 내용이 들어있습니다:
This is a line of text inside the file
참고: String.getBytes()는 플랫폼 기본 캐릭터셋을 사용하여 문자열을 바이트 배열로 변환합니다. 결정적 결과를 위해 캐릭터셋을 지정하세요(예: data.getBytes(StandardCharsets.UTF_8)).
flush()
버퍼링된 데이터를 기본 스트림에 즉시 쓰도록 강제합니다. 스트림을 닫기 전에 데이터 지속성을 보장해야 하거나 네트워크 소켓에 쓸 때 유용합니다.
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(data.getBytes());
bos.flush(); // 데이터 전송 보장
close()
스트림을 닫고 남은 데이터를 플러시하며 시스템 자원을 해제합니다. close() 호출 후 스트림을 다시 사용할 수 없습니다.
종합적인 레퍼런스는 공식 Java 문서를 참조하세요: BufferedOutputStream API.