public static void main(String[] args) throws IOException {
String writeString = "ABC";
byte[] writeBytes = writeString.getBytes(UTF_8);
System.out.println("write String:" + writeString);
System.out.println("write bytes:" + Arrays.toString(writeBytes));
// 파일에 쓰기
FileOutputStream fos = new FileOutputStream(FILE_NAME);
fos.write(writeBytes);
fos.close();
// 파일 읽기
FileInputStream fis = new FileInputStream(FILE_NAME);
byte[] readBytes = fis.readAllBytes();
fis.close();
String readString = new String(readBytes, UTF_8);
System.out.println("readBytes = " + Arrays.toString(readBytes));
System.out.println("read String = " + readString);
}
UTF_8 인코딩셋를 사용하여 바이트 배열화 한다.문자를 바이트로, 바이트를 문자로 바꾸는 이 과정은 어렵지 않지만 반복적일 것으로 예상되며 번거롭다. 이러한 변환 과정을 알아서 처리해줄 방법이 필요하다.
스트림에 byte대신 문자를 저장, 읽기가 가능하도록 이를 자동화해주는 것이 OutputStreamWriter, InputStreamReader이다.
public static void main(String[] args) throws IOException {
String writeString = "ABC";
System.out.println("write String: " + writeString);
FileOutputStream fos = new FileOutputStream(FILE_NAME);
OutputStreamWriter osw = new OutputStreamWriter(fos, UTF_8);
osw.write(writeString);
osw.close();
FileInputStream fis = new FileInputStream(FILE_NAME);
InputStreamReader isr = new InputStreamReader(fis);
StringBuilder sb = new StringBuilder();
int ch;
while ((ch = isr.read()) != -1) {
sb.append((char) ch);
}
isr.close();
String readString = sb.toString();
System.out.println("readString = " + readString);
}
파일 스트림에 Reader와 Writer 같은 상속 객체를 붙여 사용하면, 자바는 바이트 변환에 대한 개발자의 부담을 덜어줄 수 있다.

Writer는 데이터를 문자 기반으로 출력하는 스트림이다. Reader는 데이터를 문자 기반으로 입력받는 스트림이다. 고수준 API 제공
Reader와 Writer는 InputStream과 OutputStream의 문자 데이터 처리를 간소화한 고수준 클래스이다.
바이트 변환 자동화
내부적으로 인코딩 및 디코딩 과정을 처리하여 개발자가 바이트 변환을 직접 다루지 않아도 된다.
파일 스트림과의 결합
FileReader와 FileWriter 같은 클래스는 파일 입출력을 간단하게 처리할 수 있도록 돕는다.
Reader와 Writer는 자바에서 문자 데이터를 처리하기 위한 문자 스트림이며, 바이트 데이터를 자동으로 변환하여 개발자의 작업을 단순화한다.
자바에서 스트림은 기본 스트림과 보조 스트림으로 나뉜다.
FileInputStream, FileOutputStream, FileReader, FileWriterByteArrayInputStream, ByteArrayOutputStreamBufferedInputStream, BufferedOutputStreamInputStreamReader, OutputStreamWriterDataOutputStream, DataInputStreamPrintStream기본 스트림은 데이터를 직접 다루는 스트림이며, 보조 스트림은 기본 스트림의 기능을 확장하거나 효율성을 높이는 역할을 한다.