Java InputStreamReader 완전 해설: 메서드, 인코딩, 실전 예제
Java InputStreamReader 해설
Java의 InputStreamReader가 바이트 스트림을 문자 스트림으로 연결하는 방식, 핵심 메서드, 인코딩 올바른 처리 방법을 알아봅니다.
java.io의 InputStreamReader 클래스는 원시 바이트를 문자로 변환하여 텍스트 파일, 네트워크 스트림, 문자를 나타내는 바이트 기반 소스를 읽는 데 필수적입니다.
추상 Reader 클래스를 확장하며 바이트 스트림(예: FileInputStream)과 문자 스트림 사이의 다리 역할을 합니다.
문자가 여러 바이트를 필요로 할 때(UTF-8, UTF-16 인코딩 텍스트 등) InputStreamReader는 해당 바이트들을 함께 읽어 올바른 문자를 생성합니다.
InputStreamReader 생성하기
필요한 클래스를 임포트하는 것으로 시작합니다:
import java.io.InputStreamReader;
일반적인 인스턴스화는 FileInputStream을 기본 바이트 소스로 사용합니다:
FileInputStream file = new FileInputStream("example.txt");
InputStreamReader reader = new InputStreamReader(file);
파일의 인코딩을 안다면 잘못된 해석을 피하기 위해 지정하세요:
InputStreamReader reader = new InputStreamReader(file, Charset.forName("UTF-8"));
Charset을 사용하면 리더가 의도된 캐릭터셋으로 바이트를 해석함을 보장합니다.
InputStreamReader의 핵심 메서드
read()
int read() - 단일 문자를 읽습니다.
int read(char[] cbuf) - 배열을 문자로 채웁니다.
int read(char[] cbuf, int off, int len) - off부터 cbuf에 최대 len 문자를 읽습니다.
예제: 텍스트 파일을 문자 배열로 읽기.
import java.io.*;
class Main {
public static void main(String[] args) {
char[] buffer = new char[100];
try (FileInputStream file = new FileInputStream("input.txt");
InputStreamReader reader = new InputStreamReader(file)) {
reader.read(buffer);
System.out.println("Data in the stream:\n" + new String(buffer));
} catch (IOException e) {
e.printStackTrace();
}
}
}
실행 결과
Data in the stream:
This is a line of text inside the file.
getEncoding()
리더가 사용하는 인코딩을 조회합니다:
InputStreamReader defaultReader = new InputStreamReader(file);
InputStreamReader utf8Reader = new InputStreamReader(file, Charset.forName("UTF-8"));
System.out.println("Default encoding: " + defaultReader.getEncoding());
System.out.println("UTF-8 encoding: " + utf8Reader.getEncoding());
실행 결과
Default encoding: Cp1252
UTF-8 encoding: UTF-8
인코딩이 지정되지 않으면 getEncoding()은 플랫폼의 기본 캐릭터셋을 반환합니다.
참고: 명시적 인코딩을 위해 Charset.forName()을 사용하세요. 더 자세한 내용은 Java Charset 문서를 참조하세요.
close()
사용 후 리더를 항상 닫으세요. 위 try-with-resources 구문이 자동으로 처리하지만, reader.close()를 명시적으로 호출할 수도 있습니다.
기타 유용한 메서드
| 메서드 | 설명 |
ready() | 스트림이 읽기 준비되었는지 확인합니다. |
mark(int readAheadLimit) | 나중 재설정을 위해 현재 위치를 표시합니다. |
reset() | 마지막 표시 위치로 돌아갑니다. |
종합적인 레퍼런스는 공식 InputStreamReader 페이지를 참조하세요.