본문 바로가기

자바공부

문자 스트림과 파일 입출력

728x90
반응형

* 문자 스트림은 2바이트의 유니코드 문자를 단위로 입출력하는 스트림이다.

문자화되지 않는 바이너리 바이트 값들은 문자 스트림 클래스에서 처리할 수 없다.

따라서 이미지오 ㅏ같은 바이너리 정보는 처리할 수 없다.

문자 입력 스트림은 바이트들을 전달받고, 이 바이트들을 '로컬 문자 집합'에 있는 문자인지 비교하여 문자로 변환한다.

 

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

* 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() 입력 스트림을 닫고 관련도니 시스템 자원 해제

 

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

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

 

* 파일 입출력 실행 중 예외가 발생할 수 있다.

1) 파일의 경로명이 틀린 경우, FileReader 생성자는 FilenotFoundException 예외를 발생 시킨다.

FileReader fin = new FileReader("C:\\test.txt"); // FileNotFoundException 발생가능

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

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

파일 입출력 코드에 try-catch 블록이 필요하다.

try {
	FileReader fin = new FileReader("c:\\test.txt");
    ...
    int c = fin.read();
    ..
    fin.close();
}	catch(FileNotFoundException e){
		System.out.println("파일을 열 수 없음"); 
	// 생략 가능. FileNotFoundException은 IOexception을 상속 받기 때문에 생략 가능하다.
}	catch(IOException e) {
	System.out.println("입출력 오류");
}

 

* FileReader로 텍스트 파일 읽기

import java.io.*;
public class Ch0801Ex {
	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("입출력 오류");
		}
	}
}

결과

 

반응형