프로그래밍 언어/JAVA

FileReader

· 코딩마이데이

문자 스트림 클래스

2바이트의 유니코드 문자를 단위로 출력하는 스트림입니다. 문자화되지 않은 바이너리 바이트 값들은 문자 스트림 클래스에서 처리할 수 없습니다. 따라서 이미지와 같은 바이너리 정보를 처리할 수 없습니다. 문자 입력 스트림은 바이트들을 전달받고, 이 바이트들은 '로컬 문자 집합'에 있는 문자인지 비교하여 문자로 변환합니다.

 

FileReader를 이용한 텍스트 파일 읽기

파일 입력 스트림 생성

먼저 파일 입력 스트림을 생성하고 스트림을 파일과 연결합니다.

FileReader fin = new FileReader("c:\\test.txt');

 

FileReader의 생성자는 c:\test.txt 파일을 찾아 열고, 파일과 스트림연결합니다. c:\test.txt 파일은 문자들로만 구성된 텍스트 파일입니다.

 

파일 읽기

fin.read()는 연결된 파일로부터 문자 하나를 읽어 리턴하며, 파일의 끝(EOF)를 만나면 -1을 리턴합니다. fin.read()를 이용하여 파일 전체를 읽어 화면에 출력하는 코드는 다음과 같습니다.

int c;
while ((c = fn.read()) != -1) { // 문자 하나를 c에 읽어 들인다. 파일 끝까지 반복한다.
	System.out.print((char)c); // 문자 c를 화면에 출력한다.
}

 

파일이 큰 경우 한 번에 한 문자씩 읽으면 읽는 속도가 너무 느리기 때문에 다음과 같이 한 번에 한 블록(버퍼 크기)만큼 읽는 read()를 사용하면 됩니다.

char [] buf = new char[1024]; // 1024는 1KB이다.
int n = fin.read(buf); // 한 번에 1024개 문자를 읽어 buf[]에 저장하고 실제 읽은 문자수 변환

 

버퍼란 읽고 쓸 데이터를 저장하는 배열을 부르는 용어입니다.

 

스트림 닫기

파일 읽기가 더 이상 필요 없으면 다음과 같이 close() 메서드를 호출하여 파일 입력 스트림을 닫는다. 닫힌 스트림으로부터는 더 이상 읽을 수 없습니다.

fin.close();

 

FileReader의 생성자

생성자 설명
FileReader(File file) file로부터 읽는 FileReader 생성
FileReader(String name) name 이름의 파일로부터 읽는 FileReader 생성

 

FileReader, Reader, InputStreamReader의 공통 주요 메소드

메소드 설명
int read() 한 개의 문자를 읽어 정수형으로 리턴
int read(char[] cbuf) 문자들을 읽어 cbuf 배열에 저장하고 읽은 개수 리턴
int read(char[] cbuf,int off, int len) 최대 len 개수의 문자들을 읽어 cbuf 배열의 off 위치부터 저장하고 실제 읽은 개수 리턴
String getEncoding() 스트림이 사용하는 문자 집합의 이름 리턴
void close() 입력 스트림을 닫고 관련된 시스템 자원 해제

 

파일 입출력과 예외 처리

파일 입출력 실행 중 예외가 발생할 수 있습니다. 첫째, 파일의 경로명이 틀린 경우, FileReader 생성자는 FileNotFoundException 예외를 발생시킵니다.

FileReader fin = new FileReader("c:\\test.txt'); // fileNotFoundException 발생 가능

 

둘째, 파일 읽기, 쓰기, 닫기를 하는 동안 입출력 오류가 발생하면, read(), write(), close() 메소드는 IOException 예외를 발생시킵니다.

int c = fin.read(); // IOException 발생 가능

 

그러므로 파일 입출력 코드에 다음과 같은 try-catch 블록이 필요합니다.

try {
	FileReader fin = new FileReader("c:\\text.txt");
	...
	int c = fin.read();
	...
    fin.close();
} catch (FileNotFoundException e) {
	System.out.println("파일이 열 수 없음");
} catch (IOException e) {
	System.out.println("입출력 오류");
}

 

FileReader로 텍스트 파일 읽기

import java.io.FileReader;
import java.io.IOException;

public class FileReaderEx {
    public static void main(String[] args) {
        FileReader fin = null;
        try {
            fin = new FileReader("c:\\windows\\system.ini"); // 문자 입력 스트림 생성
            int c;
            while ((c = fin.read()) != -1) {
                System.out.print((char)c);
            }
            fin.close();
        }
        catch (IOException e) {
            System.out.println("입출력 오류");
        }
    }
}

 

실행 결과

; for 16-bit app support
[386Enh]
woafont=dosapp.fon
EGA80WOA.FON=EGA80WOA.FON
EGA40WOA.FON=EGA40WOA.FON
CGA80WOA.FON=CGA80WOA.FON
CGA40WOA.FON=CGA40WOA.FON

[drivers]
wave=mmdrv.dll
timer=timer.drv

[mci]