Java 9부터 InputStream 클래스에 새롭게 추가된 readAllBytes() 메서드를 사용하면 스트림의 모든 바이트를 한 번에 바이트 배열(byte array)로 읽어들일 수 있습니다. 이 메서드는 InputStream 객체에서 남아 있는 모든 바이트를 읽고, 스트림의 끝(end of stream)이 감지되거나 예외가 발생할 때까지 실행을 블로킹(blocking)합니다.
readAllBytes() 메서드의 특징과 주의 사항
readAllBytes() 메서드는 InputStream 인스턴스를 자동으로 닫아주지 않는다는 점에 유의해야 합니다. 따라서 리소스 누수를 방지하려면 try-with-resources 문법을 사용하는 것이 좋습니다.
또한 스트림의 끝에 도달한 후 이 메서드를 다시 호출하면 빈 바이트 배열(empty byte array)이 반환될 수 있습니다.
이 메서드는 모든 바이트를 간편하게 하나의 바이트 배열로 읽어들이고 싶은 단순한 사용 사례에 적합합니다. 반면, 대용량 데이터를 담고 있는 입력 스트림을 처리할 때는 메모리 부족(OutOfMemoryError) 위험이 있으므로 사용하지 않는 것이 좋습니다.
문법(Syntax)
public byte[] readAllBytes() throws IOException
예제 코드
아래 예제에서는 "C:\Temp" 폴더에 다음과 같은 간단한 데이터를 담은 "Technology.txt" 파일을 미리 생성해 두었습니다.
{ "JAVA", "PYTHON", "JAVASCRIPT", "SELENIUM", "SCALA"}그리고 Files.newInputStream()으로 파일 입력 스트림을 열고, readAllBytes()로 전체 내용을 읽은 뒤 UTF-8 문자셋을 이용해 문자열로 변환하여 출력합니다.
import java.nio.*;
import java.nio.file.*;
import java.io.*;
import java.util.stream.*;
import java.nio.charset.StandardCharsets;
public class ReadAllBytesMethodTest {
public static void main(String args[]) {
try(InputStream stream = Files.newInputStream(Paths.get("C://Temp//Technology.txt"))) {
// 스트림을 문자열로 변환
String contents = new String(stream.readAllBytes(), StandardCharsets.UTF_8);
// 문자열 내용 출력
System.out.println(contents);
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}실행 결과(Output)
"JAVA", "PYTHON", "JAVASCRIPT", "SELENIUM", "SCALA"
정리
readAllBytes()는 작은 크기의 파일이나 스트림 내용을 코드 한 줄로 손쉽게 읽어올 수 있는 편리한 메서드입니다. 다만 스트림을 자동으로 닫지 않으므로 try-with-resources와 함께 사용하고, 대용량 데이터에는 버퍼 기반의 다른 방식을 고려하는 것이 바람직합니다.