[Java] 파일 한글자씩 읽기(FileReader), 쓰기(FileWriter)

    FileReader

     

    사실 독자적으로 FileReader를 쓰는 케이스는 많지 않다. 어쩌다 간혹 쓰는 경우는 있지만 보통 다른 파일 리더(Reader)에 포함이 되는 경우가 많은데 속도적인 부분도 있겠지만 한글자씩 읽는 방식이기 때문에 효율적이지 않기 때문이다. 해당 방식은 Java 1.1 부터 사용하기 시작한 고전적인 방식으로 어떤 개념인지만 알고 넘어가도 무방하다. (어차피 활용할 가능성이 매우 적은 방식이다)

     

    생성자

    생성자 파라미터 내용
    FileReader File 파일객체 File 객체를 지정하여 생성
    String 파일명 파일명을 지정하여 생성

     

    주요 메서드

    메서드 파라미터 내용
    int read() - 스트림에서 한 개의 문자 읽음
    void close() - 스트림을 닫고, 리소스 해제

     

    예제

    import java.io.File;
    import java.io.FileReader;
    
    public class test {
    
    	public static void main(String[] args) throws Exception {
    		// test.txt 파일을 file 객체에 담는다
    		File file = new File("E:/Project/java-bedev/data/test.txt");
    		// FileReader에 test.txt 파일 객체를 파라미터로 전달하여 입력 스트림 생성
    		FileReader reader = new FileReader(file);
    		
    		int ch = 0;
    		while((ch = reader.read()) != -1) {
    			System.out.print((char)ch);
    		}
    		
    		reader.close();
    	}
    }

    test.txt

    abcdefghijklmn

    실행결과

    abcdefghijklmn

     

    FileReader는 한글자씩 읽으며, 마지막을 읽는 순간 -1 값이 -1까지 While문으로 반복을 하는 구조이다. 거기에 int형으로 값을 반환하기 때문에 char로 형변환을 해줘야 정상적으로 출력이 된다.

     

    try ~ catch를 쓰는 예제

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class test {
    
    	public static void main(String[] args) {
    		try {
    			// test.txt 파일을 file 객체에 담는다
    			File file = new File("E:/Project/java-bedev/data/test.txt");
    			// FileReader에 test.txt 파일 객체를 파라미터로 전달하여 입력 스트림 생성
    			FileReader reader = new FileReader(file);
    			int ch = 0;			
    			while((ch = reader.read()) != -1) {
    				System.out.print((char)ch);
    			}
    			
    			reader.close();
    		} catch (FileNotFoundException e) {
    			// 파일이 없을 경우
    			e.printStackTrace();
    		} catch (IOException e) {
    			// 입출력 에러 발생시
    			e.printStackTrace();
    		}		
    	}
    }

     

    FileWriter

     

    FileReader의 쓰기 버전은 FileWriter이다. FileWriter 역시나 효율적인 면이 부족하여 Buffered 방식에 비해서 잘 사용되지 않지만 가장 기본적인 버전이기에 이해는 해야 할 것이다. 

     

    생성자

    생성자 파라미터 내용
    FileWriter File file File 객체로 FileWriter 생성
    File file, boolean append File 객체로 생성하며 두번째 파라미터가 true면 추가 기록, false면 새로 기록
    String 파일명 파일명으로 FileWriter 생성
    String 파일명, boolean append 파일명으로 생성하며 두번째 파라미터가 true면 추가 기록, false면 새로 기록

     

    주요 메서드

    메서드 파라미터 내용
    int write String srt 지정한 문자열 출력
    void close - 입력 스트림을 닫고, 스트림 관련 리소스 해제

     

    예제

    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class test {
    
    	public static void main(String[] args) throws IOException {
    		writerFile("opqrstuvwxyz");		
    	}
    		
    	public static void writerFile(String str) throws IOException {
    		// test2.txt 파일 객체를 생성
    		File file = new File("E:/Project/java-bedev/data/test2.txt");
    		// test2.txt 파일로 FileWriter 생성
    		FileWriter writer = new FileWriter(file);
    		
    		// str 내용을 쓴다
    		writer.write(str);
    		// 파일을 닫는다
    		writer.close();
    	}
    }

     

    참고로, 파일 객체의 경우 읽기는 파일이 없을 경우 FileNotFound와 같은 에러가 발생하지만 FileWriter는 파일을 신규로 생성한다. 다만 폴더가 없을 경우

    Exception in thread "main" java.io.FileNotFoundException: E:\Project\java-bedev\data2\test2.txt (지정된 경로를 찾을 수 없습니다) at java.base/java.io.FileOutputStream.open0(Native Method) at java.base/java.io.FileOutputStream.open(FileOutputStream.java:291) at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:234) at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:184) at java.base/java.io.FileWriter.<init>(FileWriter.java:96) at test.writerFile(test.java:15) at test.main(test.java:8)

    마찬가지로 FileNotFoundException이 발생하니 폴더를 미리 생성한 후 실행해야 한다. 참고로 Java에서 File객체로 폴더를 한번에 생성하는 방법이 있으니, 폴더를 만들어야 되는 상황이라면 에러가 떨어지면 Exception을 발생시켜서 폴더를 생성하는 로직을 넣으면 된다

     

    반응형

    댓글

    Designed by JB FACTORY