문자 스트림 

- 2바이트(16bit)의 유니코드(Unicode) 문자를 입출력하기위한 스트림이다.

- 문자 단위로 입출력을 수행한다.

- 모든 문자 스트림 클래스는 Reader 및 Writer 클래스의 서브 클래스이다.

Bridge Stream

- 1byte stream을 2byte stream으로 변환해주는 stream이다.

- Bridge Stream에는 InputStreamReader 와 OutputStreamWriter 클래스가 있다.

 

Reader 클래스는 문자 입력을 위한 추상 클래스로, 모든 문자 입력 스트림의 최상위 클래스이다.

import java.io.InputStreamReader;
import java.io.Reader;

public class Ex08_Reader {

	public static void main(String[] args) {
		int data;
		char ch;
/*
 		Reader : 문자 입력 스트림. 추상 클래스 
 		InputStreamReader : byte 스트림을 문자 스트림으로 변환(bridge stream)
 */
		
		try {
			Reader rd = new InputStreamReader(System.in);
			
			// "ABC엔터" 입력 : 65 66 67 13 10
			// "대한엔터" 입력 : 45824 54620 13 10
			// 영어 한글 모두 한번에 한문자씩 입력
			
			
			System.out.println("입력[ctrl+z:종료]");
			while( (data = rd.read()) != -1) {
				// System.out.println(data);
				ch = (char) data;
				// System.out.write(ch);
					// 한글깨짐. 2byte 문자를 1byte만 출력하므로 
				System.out.print(ch);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

문자 스트림을 입출력하기 위한 Bridge Stream 인 InputStreamReader를 추상 클래스인 Reader 로 업캐스팅 함. read() 입력한 값이 없을때까지 출력. ( -1 이 파일 끝 더이상 읽을 것이 없을때의 값)

 다른 포스팅에서는 read()가 1바이트씩 읽는 메소드였으나 (InputStream과 OutputStream에서는 바이트 스트림이기 때문에 1바이트만 읽음) 하지만 문자 스트림에서는 (Reader) 단일 문자를 읽으므로 2바이트를 읽는다. 따라서 2바이트를 data에 넘겨주고, ch로 강제 형변환 하고 write(ch)로 출력하면 한글은 2바이트 이기 때문에 깨진다.

대한 을 입력하면 문자 '대'를 data에 넘겨주고 그 대에 해당하는 ASCII 코드 값이 ch에 저장되고 ch(2바이트)를 출력할 때 write() 메소드는 1byte만 출력하므로 깨져서 나온다.

 

따라서 print(ch); 메소드로 출력해야 한다. 

+ Recent posts