Java BufferedInputStream 마스터하기: 효율적 바이트 읽기와 고급 메서드
Java BufferedInputStream 클래스 개요
이 튜토리얼은 Java BufferedInputStream 클래스, 핵심 메서드, 파일 I/O 성능을 향상시키는 실전 예제를 다룹니다.
java.io 패키지의 BufferedInputStream 클래스는 내부 버퍼를 추가하여 바이트 수준 입력 스트림을 향상시키고, 더 빠르고 효율적인 데이터 읽기를 가능하게 합니다.
추상 InputStream 클래스를 확장합니다.
BufferedInputStream 작동 원리
BufferedInputStream은 기본적으로 8,192바이트의 내부 버퍼를 유지합니다. 읽기 연산이 요청되면 기본 스트림(일반적으로 파일)에서 바이트 블록을 가져와 이 버퍼에 저장합니다. 이후 읽기 호출은 버퍼가 소진될 때까지 버퍼에서 바이트를 소비하며, 그 시점에 또 다른 블록이 로드됩니다. 이는 비용이 많이 드는 디스크 I/O를 줄이고 데이터 소비를 가속화합니다.
BufferedInputStream 생성하기
BufferedInputStream을 생성하려면 먼저 클래스를 임포트합니다:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
그런 다음 FileInputStream 같은 하위 수준 스트림을 래핑하여 인스턴스화합니다:
FileInputStream file = new FileInputStream("example.txt");
BufferedInputStream buffer = new BufferedInputStream(file);
선택적으로 커스텀 버퍼 크기를 지정할 수 있습니다:
int bufferSize = 16_384; // 16 KB
BufferedInputStream buffer = new BufferedInputStream(file, bufferSize);
버퍼가 클수록 디스크 접근 횟수가 줄어듭니다. 큰 파일이나 네트워크 스트림에 유용합니다.
BufferedInputStream의 핵심 메서드
read()
int read() - 단일 바이트를 읽어 정수(0~255)로 반환하거나 스트림 끝에 도달하면 -1을 반환합니다.
int read(byte[] b) - 최대 b.length 바이트를 배열에 읽습니다.
int read(byte[] b, int off, int len) - off 오프셋부터 b에 최대 len 바이트를 읽습니다.
예제: 텍스트 파일을 바이트 단위로 읽어 콘솔에 출력.
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class Main {
public static void main(String[] args) {
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream("input.txt"))) {
int byteRead;
while ((byteRead = in.read()) != -1) {
System.out.print((char) byteRead);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
출력:
This is a line of text inside the file.
available()
available() 메서드는 블로킹 없이 스트림에서 읽을 수 있는 바이트 수를 보고합니다. 큰 스트림 처리 시 진행 상황을 파악하는 데 도움이 됩니다.
FileInputStream file = new FileInputStream("input.txt");
BufferedInputStream buffer = new BufferedInputStream(file);
System.out.println("Bytes available: " + buffer.available());
// ... 데이터 읽기
System.out.println("Bytes remaining: " + buffer.available());
buffer.close();
skip(long n)
지정된 바이트 수를 건너뛰려면 skip()을 사용합니다. 실제 건너뛴 바이트 수를 반환하며, 스트림 끝에 도달하면 요청보다 적을 수 있습니다.
buffer.skip(5); // 처음 5바이트 건너뛰기
close()
스트림을 닫아(가급적 try-with-resources 블록 사용) 시스템 자원을 해제합니다. 닫은 후에는 스트림을 재사용할 수 없습니다.
기타 주목할 만한 메서드
| 메서드 | 설명 |
mark(int readLimit) | 스트림의 현재 위치를 표시합니다. 이후 reset() 호출은 readLimit 바이트 이상 읽지 않은 경우 이 지점으로 돌아갑니다. |
reset() | 스트림을 마지막 표시 위치로 재배치합니다. |
완전한 레퍼런스는 공식 Java 문서를 참조하세요.