문자 기반 스트림: (File, Piped) Reader/Write
1. Reader와 Writer
- 바이트 기반 스트림의 조상이 InputStream과 OutputStream인 것과 같이 문자 기반 스트림
에서는 Reader와 Writer가 그와 같은 역할을 한다.
- byte 배열 대신 char 배열을 사용한다는 것 외에는 바이트 기반 스트림과는 다르지 않다.
- 문자 기반 스트림은 단순히 2 byte로 스트림을 처리하는 것만을 의미하지 않고, 문자 데이터를
다루는데 필요한 또 하나의 정보는 인코딩이 있다.
- 그러므로, Reader는 특정 인코딩을 읽어서 유니코드로 변환하고 Writer는 유니코드를 특정 인코딩
으로 변환하여 저장한다.
2. FileReader와 FileWriter
- FileInputStream과 FileOutputStream의 방법이랑 다르지 않으므로, 바로 밑 예제를 통해서 이해하자.
2-1. FileReader와 FileWriter를 이해하기 위한 예제(1)
: File의 바이트 기반과 문자 기반의 스트림 차이를 알아보는 예제이다.
2-2. FileReader와 FileWriter를 이해하기 위한 예제(2)
: 공백과 띄어쓰기가 있는 문자 데이터를 받아서 공백을 모두 없앤 후, 다시 출력하는 예제이다.
3. PipedRead와 PipedWriter
- 이 문자 기반 스트림은 쓰레드 간에 데이터를 주고받을 때 사용된다.
- 다른 스트림과는 달리 입력과 출력 스트림을 하나의 스트림으로 연결(connect)해서 데이터를
주고받는다는 특징이 있다.
- 스트림을 생성한 다음에 어느 한쪽 쓰레드에서 connect()를 호출해서 입력과 출력 스트림을 연결한다.
( tip) 입출력을 마친 후에는 어느 한쪽 스트림만 닫아도 나머지 스트림은 자동으로 닫힌다. )
3-1. Piped 읽기/쓰기를 이해하기 위한 예제(1)
: 두 쓰레드가 PipedReader/PipedWriter를 이용해서 서로 메시지를 주고받는 예제이다.
( 쓰레드를 시작하기 전에 PipedReader와 PipedWriter를 연결해야 한다는 것에 유의하자. )
( StringWriter는 CharArrayWriter처럼 메모리를 사용하는 스트림인데, 내부적으로 String Buffer를
가지고 있어서 출력하는 내용이 여기에 저장된다. )
( 그러므로, toString()을 사용하면 저장된 값이 나오게 된다. )
4. StringReader와 StringWriter
- 위 3-1 예제(1)에서 봤듯이 StringWriter에 출력되는 데이터는 내부의 StringBuffer에 저장된다.
- 그러므로, StringWriter의 아래와 같은 메서드를 이용해서 저장된 데이터를 얻을 수 있다.
(1) StringBuffer getBuffer()
: StringWriter에 출력한 데이터가 저장된 StringBuffer를 반환한다.
(2) String toString()
: StringWriter에 출력된 문자열을 반환한다.
4-1 . StringReader와 StringWriter를 이해하기 위한 예제(1)
: StringWriter의 메서드를 이해하기 위한 예제이다.