[JAVA] 문자 Stream : FileReader / FileWriter

2019. 8. 7. 11:26 JAVA/Java IO

문자 Stream : FileReader / FileWriter




File Reader와 FileWriter는 파일에 저장된 바이트를 유니코드 문자로 변환해서 읽어 들이거나 출력할 유니코드 문자를 디폴트 문자 인코딩의 바이트로 변환해서 파일에 저장하는 데 사용되는 입출력 클랙스이다.


File Reader와 FileWriter는 각각 InputStreamReader나 OutputStreamWriter의 하위 클래스로 유니코드 문자와 바이트간의 변환 기능을 포함하고 있다. 


[JAVA] 문자 Stream : Reader / Writer

[JAVA] 문자 Stream : InputStreamReader / OutputStreamWriter



* FileReader / FileWriter 의 생성자


FileReader는 파일로부터 입력을 위한 스트림을 생성하는 클래스로 데이터가 입력될 파일의 정보를 인자로 받는다.


FileReader 의 생성자 

설 명 

FileReader(File file) throws IOException

file로 지정된 파일에 대한 입력 스트림을 생성한다. 

FileReader(FileDescriptor fd) throws IOException

fd로 지정된 FileDescriptor에 대한 입력 스트립을 생성한다.

FileReader(String fileName) throws IOException 

fileName로 지정한 경로의 파일에 대한 입력 스트림을 생성한다. 


FileWriter는 파일로 데이터를 출력하기 위한 출력 스트림을 제공한다.


FileWriter 의 생성자 

설 명 

FileWriter(File file) throws IOException

file로 지정된 파일에 대한 출력 스트림을 생성한다. 

FileWriter(File file, boolean append) 

file로 지정된 파일에 append 모드를 설정하여 출력 스트림을 생성한다. 

FileWriter(FileDescriptor fd) throws IOException

fd로 지정된 FileDescriptor에 대한 출력 스트립을 생성한다.

FileWriter(String fileName) throws IOException 

fileName로 지정한 경로의 파일에 대한 출력 스트림을 생성한다. 

FileWriter(String fileName, boolean append) throws IOException

fineName로 지정한 경로의 파일에 append 모드를 설정하여 출력 스트림을 생성한다. 


boolean append : True 면 파일의 끝에 출력 데이터를 붙이며, False면 파일에 덮어쓴다.


* FileReader / FileWriter의 메소드는 상위 클래스 (java.lang.Object, java.io.Writer, java.io.OutputStreamWriter)를 상속받는다.



* FileReader / FileWriter 예제


 

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; public class FileReaderWriter { public static void main(String[] args){ int i = 0; // sample.txt 파일을 File 객체로 가져온다. File file = new File("sample.txt"); FileReader fr = null; FileWriter fw = null; InputStreamReader isr = null; try{ // InputStreamReader로 콘솔에서 입력한 문자를 가져오는 객체를 생성한다. isr = new InputStreamReader(System.in); // sample.txt 에 출력할 FileWriter 객체를 생성한다. // true 이므로, 기존의 sample.txt 파일 뒤에 이어서 출력한다. fw = new FileWriter(file, true); // 콘솔에서 입력받은(System.in) 문자를 FileWriter에 쓴다. // 컨트롤 - Z 가 입력될 때까지 입력을 받는다. while((i=isr.read())!=-1){ fw.write(i); } // 입력받은 버퍼를 파일에 내보낸다. fw.flush(); // sample.txt 파일을 읽을 FileReader 객체를 생성한다. fr = new FileReader(file); // sample.txt 파일의 끝까지 읽으면서 콘솔에 출력한다. while((i=fr.read())!=-1){ System.out.print((char)i); } }catch(IOException e){ e.printStackTrace(); }finally{ // InputStreamReader, FileReader, FileWriter를 닫아준다. if(isr != null) try{isr.close();}catch(IOException e){} if(fr != null) try{fr.close();}catch(IOException e){} if(fw != null) try{fw.close();}catch(IOException e){} } } }





- InputStreamReader를 통해 콘솔에서 문자를 입력받는다.

- 문자입력은 "-1" 이 나올때 까지, 그러니까 "Ctrl-Z"를 입력받을때 까지 받으며, FileWriter 객체에 쓴다.

- 문자 입력이 완료되면 flush() 메소드를 통해, FileWriter의 버퍼에 저장된 입력받은 문자를 "sample.txt" 파일에 쓴다.

- FileWriter 개체 생성시, append 인자를 True로 했기 때문에, 입력받은 문자를 "sample.txt"에 쓸때, 기존의 내용 뒤에 붙여서 쓰게 된다.


- 파일에 문자를 입력했으니, 이제 "sample.txt" 파일의 내용을 가져와서 콘솔에 출력해본다.

- FileReader 객체를 생성하고, "sample.txt" 파일로부터 문자를 읽어오면서 콘솔에 출력한다.


- 콘솔의 결과를 보면, 입력은 "개발이 하고 싶어요  FileReader / File Writer ㅋㅋ"를 입력했지만, 출력 결과에 제일 처음에 "안녕하세요"가 붙어있다.

- 이 프로그램이 시작하기전에 "sample.txt" 파일에 "안녕하세요" 가 입력되어 있었으며, 입력받은 내용을 뒤에 붙여서 파일에 썼다. 그리고 그 전체 내용을 읽어와서 콘솔에 뿌려준 것이다.


* FileReader /FileWriter 와 FileInputStream / FileOutputStream 의 차이


FileInputStream / FileOutputStream 과  FileReader / FileWriter 모두 File에 데이터를 입력하고 출력하는 객체이다.

하지만 이 두 종류의 객체는 차이가 있다.

FileInputStream / FileOutputStream 은 InputStream / OutputStream 을 상속받고 있으며, FileReader / FileWriter는 Reader와 Writer를 상속받고 있다.                                                                                                                                                                                                     따라서 FileInputStream / FileOutputStream 은 byte 단위의 입출력을 처리하고 FileReader / FileWriter는 바이트를 문자(Char)로 변환하여 입출력을 처리한다.


FileInputStream / FileOutputStream은 1바이트 이상의 문자인 한글 등을 처리하기 위해 버퍼를 사용해서 처리해야 하지만, FileReader /FileWriter에서는 한글도 처리가 가능하다.



[JAVA] ByteStream : FileInputStream / FileOutputStream


                         

FileReaderWriter.zip


JAVA API : FileReader         


JAVA API : FileWriter



출처: https://hyeonstorage.tistory.com/248?category=578560 [개발이 하고 싶어요]