문자 데이터를 다룬다는 것 말고는 바이트기반 스트림과 거의 비슷하다.
문자기반 스트림의 조상은 Reader / Writer이다.
바이트 스트림과 다르게 byte[]대신 char[]를 사용한다.
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 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개 만큼의 문자열)
문자 기반 스트림은 단순히 2byte로 스트림을 처리한다는 것만을 의미하지는 않는다.
문자 데이터를 다루는데 필요한 또 하나의 정보는 인코딩(encoding) 이다.문자 기반 스트림의 자손들은 여러 종류의 인코딩과 자바에서 사용하는 유니코드(UTF-16)간의 변환을 자동적으로 처리해 준다.
FileReader/FileWriter는 파일로부터 텍스트를 읽고, 파일에 출력하는데 사용된다.
FileInputStream/FileOutputStream과 다르지 않다.
같은 내용의 파일(text.txt)를 FileInputStream과 FileReader로 각각 읽어서 화면에 출력하여 비교한다.
다음 예제에서의 test.txt파일은 UTF-8형식으로 저장하였다.
import java.io.*;
public class Ex15_16 {
public static void main(String[] args) {
try {
String fileName = "D:\\studySpace\\test.txt";
FileInputStream fis = new FileInputStream(fileName);
FileReader fr = new FileReader(fileName);
int data = 0;
while((data=fis.read()) != -1) {
System.out.print((char)data);
}
fis.close();
System.out.println();
while((data=fr.read()) != -1) {
System.out.print((char)data);
}
fr.close();
System.out.println();
} catch(IOException e) {
e.printStackTrace();
}
}//main
}
Hello, ìë
íì¸ì?
Hello, 안녕하세요?
InputStream을 사용한 출력 첫 줄의 내용은 다 한글이 다 깨져있고,
Reader를 사용한 출력 두번째 줄은 정상적으로 출력되었다.