1. Reader 와 Writer
자바 세계에서는 편의성을 위하여 byte 대신 char 타입을 이용하여 파일을 입출력 할 수 있도록 한다.
어떤 타입을 다루느냐가 다른 것일뿐 활용 방법은 byte 기반 스트림과 굉장히 유사하다.
read 메서드 | writer 메서드 |
int read() | void write(int b) |
int read(char[] c) | void write(char[] c) void write(String s) |
abstract int read(char[] c, int off, int len) | abstract void write(char[] c, int off, int len) void write(String s, int off, int len) |
위의 표에서도 확인할 수 있듯이
write 메서드에서는 String 을 활용하고 있지만, read 에서는 찾아볼 수 없다.
왜 read() 메서드에서는 문자열이 아닌 문자 배열만을 사용하고 있을까?
그것은 문자열이 가진 특징 때문이다.
String 은 기본적으로 변경 불가능한 클래스 즉, immurtable class 이다.
write() 메서드 사용 시에는 지정한 값이 변할 일 없이 바로 출력되기 때문에
편의상 String 을 사용할 수 있도록 구현된 것이다.
read() 메서드 사용 시에는 한 문자씩 읽어오기 때문에
문자열의 길이만큼 지속적으로 변경될 수 있다는 가능성에 의하여 String을 사용할 수 없도록 한 것이다.
앞서 바이트 기반 스트림으로 출력하여 '가나다라' 부분이 이상하게 출력되었던 것을 기억해보자.
// 파일을 읽어온다.
FileReader fr = new FileReader(test.txt);
// 반환 값을 담을 변수
// char 크기 만큼 읽어온다.
int i = 0;
while((i = fr.read()) != -1) {
// int 타입으로 반환 받았기 때문에
// char 타입으로 명시적 형변환 해준다.
System.out.print((char)i);
}
// 출력 결과
가나다라
2. 문자 기반 보조 스트림
문자 기반 보조 스트림은 바이트 기반 보조 스트림과 활용이 매우 유사하다.
또한 여기서도 버퍼를 활용하는 보조 스트림이 존재한다.
BufferedReader 에는 문자 기반이기에 가능한 readLine() 이라는 메서드를 사용할 수 있는데,
이는 한 줄 씩 읽을 수 있는 메서드이다.
(BufferedWriter 는 newLine() 이라는 줄바꿈 해주는 메서드가 있다.)
// 버퍼 생성
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
// 반환 값을 담을 변수
String line = "";
// 예외 처리
try {
// String 을 반환하기 때문에
// EoF 시에 -1 이 아니라 null 이 반환
while((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 출력 결과
abcd
1234
가나다라
문자 기반 보조 스트림에는 바이트와 문자 간의 연결이 가능한 스트림이 존재한다.
byte 👉 char : InputStreamReader
char 👉 byte : OutputStreamWriter
즉 자바 외부와 내부를 연결하는 것이라고 볼 수 있다.
여기서 가장 주의해야 할 점은 바로 인코딩의 타입이다.
작성 시에 사용된 인코딩 타입과 해석 시에 사용된 인코딩 타입이 다르면 전혀 다르게 표현될 수 있기 때문이다.
3. Character set : 문자 집합
문자 집합 마다 영어, 숫자, 한글을 나타내는 byte가 달라진다.
ms949 | UTF-8 | UTF_16 | |
영어 | 1 byte | 1 byte | 2 byte |
숫자 | 1 byte | 1 byte | 2 byte |
한글 | 2 byte | 3 byte | 2 byte |
📌UTF 는 8, 16, 32 등 여러 가지 종류가 있어서 이를 구분하기 위한 구분자를 문자 앞부분에 보이지 않는 값으로 추가해 놓는다. 이러한 값을 BOM(Byte Order Mark) 이라고 하며, 2 byte 크기이다.
즉, UTF-8 방식으로 '가나' 를 작성하면 6 byte 가 아니라 8 byte 가 저장되는 것이다.
'JAVA' 카테고리의 다른 글
SimpleDateFormat : 날짜와 시간 출력하기 (0) | 2022.10.07 |
---|---|
Serializable 과 File 활용하기 (0) | 2022.10.05 |
바이트 기반 스트림 : InputStream, OutPutStream (0) | 2022.10.02 |
Iterator, ListIterator, Enumeration (0) | 2022.09.29 |
Stack과 Queue (0) | 2022.09.29 |