본문 바로가기

프로그래밍/JAVA

[ JAVA ] 문자기반 스트림

1. Reader와 Writer

Reader/Writer는 문자기반의 스트림의 조상이다.
Reader/Writer의 메서드는 byte배열 대신 char배열을 사용한다는 것 외에는 InputStream/OutputStream의 메서드와 다르지 않다.
▶ 문자기반 스트림, 즉 Reader/Writer 그리고 그 자손들은 여러 종류의 인코딩과 자바에서 사용하는 유니코드(UTF-16)간의 변환을 자동적으로 처리해준다.
Reader는 특정 인코딩을 읽어서 유니코드로 변환하고 Writer는 유니코드를 특정 인코딩으로 변환하여 저장한다.

<Reader의 메서드>

메서드 설 명
abstract void close() 입력스트림을 닫음으로써 사용하고 있던 자원을 반환한다.
void mark(int readlimit) 현재위치를 표시해놓는다. 후에 reset()에 의해서 표시해 놓은 위치로 다시 돌아갈 수 있다.
boolean markSupported() mark()와 reset()을 지원하는지를 알려 준다.
int read() 입력소스로부터 하나의 문자를 읽어 온다. char의 범위인 0~65535범위의 정수를 반환하며, 입력스트림의 마지막 데이터에 도달하면, -1을 반환한다.
int read(char[] c) 입력소스로부터 매개변수로 주어진 배열 c의 크기만큼 읽어서 배열 c에 저장한다. 읽어 온 데이터의 개수 또는 -1을 반환한다.
abstract int read(char[] c, int off, int len) 입력소스로부터 최대 len개의 문자를 읽어서, 배열 c의 지정된 위치(off)부터 읽은 만큼 저장한다. 읽어 온 데이터의 개수 또는 -1을 반환한다.
int read(CharBuffer target) 입력소스로부터 읽어서 문자버퍼(target)에 저장한다.
boolean ready() 입력소스로부터 데이터를 읽을 준비가 되어있는지 알려 준다.
void reset() 입력소스에서의 위치를 마지막으로 mark()가 호출되었던 위치로 되돌린다.
long skip(long n) 현재 위치에서 주어진 문자 수(n)만큼을 건너뛴다.

<Writer의 메서드>

메서드 설 명
Writer append(char c) 지정된 문자를 출력소스에 출력한다.
Writer append(CharSequence c) 지정된 문자열(CharSequence)을 출력소스에 출력한다.
Writer append(CharSequence c, int start, int end) 지정된 문자열(CharSequence)의 일부를 출력소스에 출력(CharBuffer, String, StringBuffer가 CharSequence를 구현)
abstract void close() 출력스트림을 닫음으로써 사용하고 있던 자원을 반환한다.
abstract void flush() 스트림의 버퍼에 있는 모든 내용을 출력소스에 쓴다.(버퍼가 있는 스트림에만 해당됨)
void write(int b) 주어진 값을 출력소스에 쓴다.
void write(char[] c) 주어진 배열 c에 저장된 모든 내용을 출력소스에 쓴다.
abstract void write(char[] c, int off, int len) 주어진 배열 c에 저장된 내용 중에서 off번째부터 len길이만큼만 출력소스에 쓴다.
void write(string str) 주어진 문자열(str)을 출력소스에 쓴다.
void write(String str, int off, int len) 주어진 문자열(str)의 일부를 출력소스에 쓴다. (off번째 문자부터 len개 만큼의 문자열)

2. FileReader와 FileWriter

FileReader/FileWriter는 파일로부터 텍스트데이터를 읽고, 파일에 쓰는데 사용된다.
public static void main(String args[]) {
    try {
        String fileName = "test.txt";  // Hello, 안녕하세요?
        FileInputStream fis = new FileInputStream(fileName);
        FileReader fr = new FileReader(fileName);
        
        int data = 0;
        // FileInputStream을 이용해서 파일내용을 읽어 화면에 출력한다.
        // 한글이 깨져서 출력됨 (1byte씩 읽기 때문에 한글이 깨져서 출력됨)
        while((data=fis.read()) != -1) {
            System.out.print((char)data);   
        }
        System.out.println();
        fis.close();
 
        // FileReader를 이용해서 파일내용을 읽어 화면에 출력한다.
        // 한글이 깨지지 않고 출력됨 (2byte 읽기 가능)
        while((data=fr.read()) != -1) {
            System.out.print((char)data);   
        }
        System.out.println();
        fr.close();
    } catch(IOException e) {
        e.printStackTrace();
    }
}

3. PipedReader와 PipedWriter

PipedReader/PipedWriter는 쓰레드 간에 데이터를 주고받을 때 사용된다.
▶ 다른 스트림과는 달리 입력과 출력스트림을 하나의 스트림으로 연결(connect)해서 데이터를 주고받는다는 특징이 있다.
▶ 스트림을 생성한 다음에 어느 한쪽 쓰레드에서 connect()를 호출해서 입력스트림과 출력스트림을 연결한다.
    입출력을 마친 후에는 어느 한쪽 스트림만 닫아도 나머지 스트림은 자동으로 닫힌다.
▶ 주의) 쓰레드를 시작하기 전에 PipedReaderPipedWriter를 연결해야한다.

4. StringReader와 StringWriter

StringReader/StringWriterCharArrayReader/CharArrayWriter와 같이 입출력 대상이 메모리인 스트림이다.
StringWriter에 출력되는 데이터는 내부의 StringBuffer에 저장되며 StringWriter의 아래의 메서드를 이용해서 저장된 데이터를 얻을 수 있다.
▶ StringBuffer getBuffer() : StringWriter에 출력한 데이터가 저장된 StringBuffer를 반환한다.
     String toString() : StringWriter에 출력된(StringBuffer에 저장된) 문자열을 반환한다.