Java에서 char형은 1byte가 아니라 2byte이기에 바이트기반 스트림으로 2byte문자를 처리하는데에 어려움이 있다.
바이트기반스트림를 보완하기 위해 문자기반스트림이 제공된다.
InputStream → Reader
OutputStream → Writer
https://standout.tistory.com/1470
FileReader & FileWriter
FileReader 클래스는 파일에서 문자를 읽어오는 Reader의 서브 클래스이며,
FileWriter 클래스는 파일에 문자를 쓰는 Writer의 서브 클래스.
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileExample {
public static void main(String[] args) {
try {
FileReader reader = new FileReader("input.txt");
FileWriter writer = new FileWriter("output.txt");
int character;
while ((character = reader.read()) != -1) {
writer.write(character);
}
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
[출력결과]
input.txt 파일의 내용을 output.txt 파일로 복사합니다.
CharArrayReader & CharArrayWriter
CharArrayReader 클래스는 char 배열에서 문자를 읽어오는 Reader의 서브 클래스이며, CharArrayWriter 클래스는 char 배열에 문자를 쓰는 Writer의 서브 클래스.
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.IOException;
public class CharArrayExample {
public static void main(String[] args) {
char[] chars = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
try {
CharArrayReader reader = new CharArrayReader(chars);
CharArrayWriter writer = new CharArrayWriter();
int character;
while ((character = reader.read()) != -1) {
writer.write(character);
}
System.out.println(writer.toString());
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
[출력결과]
"Hello World" 문자열이 출력됩니다.
PipedReader & PipedWriter
PipedReader 클래스는 다른 스레드에서 출력하는 데이터를 읽는 Reader의 서브 클래스이며,
PipedWriter 클래스는 다른 스레드에 데이터를 출력하는 Writer의 서브 클래스.
import java.io.*;
public class PipedExample {
public static void main(String[] args) {
try {
// PipedWriter와 PipedReader 생성
PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader(writer);
// 다른 스레드에서 데이터를 쓰는 스레드 시작
Thread writerThread = new Thread(new WriterTask(writer));
writerThread.start();
int data;
// 파이프로부터 데이터를 읽어오는 작업
while ((data = reader.read()) != -1) {
System.out.print((char) data);
}
// 스레드 종료
writerThread.join();
// 스트림 닫기
reader.close();
writer.close();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
// 다른 스레드에서 데이터를 쓰는 작업을 수행하는 클래스
class WriterTask implements Runnable {
private final PipedWriter writer;
public WriterTask(PipedWriter writer) {
this.writer = writer;
}
@Override
public void run() {
try {
// 데이터를 쓰는 작업
for (char ch = 'A'; ch <= 'Z'; ch++) {
writer.write(ch);
// 작은 딜레이를 주어서 데이터가 조금씩 쓰여지도록 함
Thread.sleep(100);
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
} finally {
try {
// 쓰기 완료 후 파이프 닫기
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
StringReader & StringWriter
StringReader 클래스는 문자열에서 문자를 읽어오는 Reader의 서브 클래스이며, StringWriter 클래스는 문자열에 문자를 쓰는 Writer의 서브 클래스.
import java.io.StringReader;
import java.io.StringWriter;
import java.io.IOException;
public class StringWriterExample {
public static void main(String[] args) {
String input = "Hello World";
try {
StringReader reader = new StringReader(input);
StringWriter writer = new StringWriter();
int character;
while ((character = reader.read()) != -1) {
writer.write(character);
}
System.out.println(writer.toString());
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
[출력결과]
"Hello World" 문자열이 출력됩니다.