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()를 호출해서 입력스트림과 출력스트림을 연결한다.
입출력을 마친 후에는 어느 한쪽 스트림만 닫아도 나머지 스트림은 자동으로 닫힌다.
▶ 주의) 쓰레드를 시작하기 전에 PipedReader와 PipedWriter를 연결해야한다.
4. StringReader와 StringWriter
▶ StringReader/StringWriter는 CharArrayReader/CharArrayWriter와 같이 입출력 대상이 메모리인 스트림이다.
▶StringWriter에 출력되는 데이터는 내부의 StringBuffer에 저장되며 StringWriter의 아래의 메서드를 이용해서 저장된 데이터를 얻을 수 있다.
▶ StringBuffer getBuffer() : StringWriter에 출력한 데이터가 저장된 StringBuffer를 반환한다.
String toString() : StringWriter에 출력된(StringBuffer에 저장된) 문자열을 반환한다.
'프로그래밍 > JAVA' 카테고리의 다른 글
[ JAVA ] 바이트기반의 보조스트림 (0) | 2023.04.10 |
---|---|
[ JAVA ] Optional<T>와 OptionalInt (0) | 2023.03.21 |
[ JAVA ] 스트림(stream) - ② (0) | 2023.03.19 |
[ JAVA ] 스트림(stream) - ① (0) | 2023.03.19 |
[ JAVA ] 쓰레드의 실행제어 (0) | 2023.02.26 |