프로그래밍 언어/JAVA

문자 집합과 InputStreamReader를 이용한 텍스트 파일 읽기

· 코딩마이데이

InputStreamReader는 스트림에 입력되는 바이트 데이트를 문자 집합을 통해 문자로 변환합니다. 이를 위해 InputStreamReader의 생성자에 문자 집합을 지정해야 합니다. 만일 읽어 들인 바이트들이 문자 집합에 속하지 않는 경우 해독할 수 없는 글자가 됩니다.

생성자 설명
InputStreamReader(InputStream in) in으로부터 읽는 기본 문자 집합의 InputStreamReader 생성
InputStreamReader
(InputStream in, Charset cs)
in으로부터 읽는 cs 문자 집합의 InputStreamReader 생성
InputStreamReader
(InputStream in, String charsetName)
in으로부터 읽는 charsetName 문자 집합의 InputStreamReader 생성

 

InputStreamReader로 문자 입력 스트림 생성

InputStreamReader는 바이트 스트림을 전달받아 문자 정보로 변환하는 스트림 객체입니다. 그러므로, 우선 텍스트 파일을 읽기 위해서는 다음과 같이 바이트 파일 입력 스트림을 먼저 생성합니다.

FileInputStream fin = new FileInputStream("C:\\Temp\\hangul.txt");

 

 

그리고 다음과 같이 InputStreamReader 객체를 생성합니다.

InputStreamReader in = new InputStreamReader(fin, "MS949");

 

생성자 InputStreamReader()의 두 번째 매개변수에는 fin으로부터 읽어 들인 바이트들을 문자로 인코딩하기 위한 문자 집합을 지정합니다.

윈도우의 메모장에서 한글 텍스트를 입력하면 디폴트로 마이크로소프트(MS)에서 만든 '한글 확장 완성형 집합'에 있는 코드로 저장합니다. 윈도우에서 디폴트로 사용하는 문자 집합은 MS949입니다.

 

파일 읽기

in.read() 문자 집합의 인코딩 규칙에 따라, fin에게 파일로부터 필요한 바이트들을 읽도록 지시하고, 읽어 들인 바이트들을 MS949 문자 집합에 정의된 문자인지 찾아 한글 문자를 리턴합니다. 만일 문자 집합에 없는 바이트들인 경우 정상적이지 않은 값을 리턴합니다.

 

 

InputStreamReader로 한글 텍스트 파일 열기

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class FileReadHangulSuccess {
    public static void main(String[] args) {
        InputStreamReader in = null;
        FileInputStream fin = null;
        try {
            fin = new FileInputStream("c:\\Temp\\hangul.txt");
            in = new InputStreamReader(fin, "MS949"); // 올바른 문자 집합 지정
            int c;

            System.out.println("인코딩 문자 집합은 " + in.getEncoding());
            while ((c = in.read()) != -1) {
                System.out.print((char) c);
            }
            in.close();
            fin.close();
        } catch (IOException e) {
            System.out.println("입출력 오류");
        }
    }
}

 

실행결과

인코딩 문자 집합은 MS949

가나다라마바사아자차카타파하

 

한글 텍스트 파일 읽기(문자 집합 지정이 잘못된 경우)

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class FileReaderHangulFail {
    public static void main(String[] args) {
        InputStreamReader in = null;
        FileInputStream fin = null;
        try {
            fin = new FileInputStream("c:\\Temp\\hangul.txt"); // 파일로 부터 바이트 입력 스트림 생성
            in = new InputStreamReader(fin, "US-ASCII");
            int c;

            System.out.println("인코딩 문자 집합은 " + in.getEncoding()); // 문자집합 출력
            while ((c = in.read()) != -1) { // 문자 단위로 묶는다.
                System.out.print((char) c);
            }
            in.close();
            fin.close();
        } catch (IOException e) {
            System.out.println("입출력 오류");
        }
    }
}

 

실행 결과

인코딩 문자 집합은 ASCII

???????????????????????????