자바 애플리케이션을 작성할 때, 파일에 데이터를 출력하거나 파일로부터 데이터를 읽어오는 일은 흔하다. '[Java] 입력 스트림(InputStream)과 출력 스트림(OutputStream)'에서 언급했던 문자 기반 스트림인 FileReader, FileWriter 클래스를 이용한 파일 입출력을 정리해보자.
1. FileReader (파일 읽기)
FileReader 클래스는 문자 기반 스트림 객체다. 텍스트 파일을 자바 프로그램으로 읽어올 때 사용한다. 문자 단위로 데이터를 읽기 때문에 텍스트 파일만 읽을 수 있다.
File file = new File("파일경로");
FileReader fileReader1 = new FileReader(file);
FileReader fileReader2 = new FileReader("파일경로");
File 객체를 통해서 생성하거나 파일 경로를 생성자의 인자로 넘겨주면 파일에서 데이터를 읽을 수 있는 스트림 객체인 FileReader가 생성된다. 이 때, 파일 경로에 해당하는 파일이 존재하지 않으면 FileNotFoundException이 발생한다. 그 밖에 파일을 읽을 수 있는 권한이 없는 경우에도 예외가 발생한다.
한 문자씩 읽기
int ch = 0;
while((ch = fileReader.read()) != -1) {
System.out.println((char)ch);
}
fileReader.close();
한 줄씩 읽기
File file = new File ("파일 경로");
FileReader fileReader = new FileReader(file);
BufferedReader bufReader = new BufferedReader(fileReader);
String line = "";
while ((line = bufReader.readLine()) != null) {
System.out.println(line);
}
bufReader.close();
버퍼에 읽기
int read;
char[] buffer = new char[100];
while ((read = fileReader.read(buffer)) != -1) {
String data = new String(buffer, 0, read);
System.out.print(data);
}
fileReader.close();
FileReader 클래스의 read() 메소드는 인자로 입력받는 버퍼에 파일의 데이터를 읽어 저장한다. 그리고 파일에서 읽은 문자의 개수를 리턴한다. read() 메소드를 사용하는 프로그래머는 리턴되는 숫자를 이용해서 버퍼에 있는 데이터를 String 객체로 생성해서 사용하게 된다.
파일에서 읽기를 모두 끝마치면 close() 메소드로 파일 리소스 사용을 정리해줘야한다.
2. FileWriter(파일쓰기)
FileWriter 클래스는 FileReader 클래스와 마찬가지로 문자 기반 스트림 객체다. 텍스트 파일에 문자열 데이터를 쓰기 위해서 사용한다. 마잔가지로 문자 데이터만 쓰기 때문에 텍스트 파일만 저장할 수 있다.
File file = new File("파일경로");
FileWriter fileWriter1 = new FileWriter(file);
FileWriter fileWriter2 = new FileWriter("파일경로");
FileWriter fileWriter4Append = new FileWriter("파일경로", true);
파일 경로에 해당하는 파일이 이미 존재하는 경우라면 그 파일을 덮어쓰게 된다. 따라서 파일에 존재하던 기존 데이터들은 사라진다. 만약 덮어쓰지 않고 파일의 뒤쪽에 붙여쓰고 싶다면 FileWriter 생성자의 두 번째 인자로 true 값을 주면 된다. 마찬가지로 파일에 쓸 수 있는 권한이 없다면 예외가 발생한다.
fileWriter.write("쓰고 싶은 데이터를 \r\n");
fileWriter.write("쓰면 된다.\r\n");
fileWriter.flush();
fileWriter.close();
간단하게 write() 메소드를 이용해서 파일에 쓰고 싶은 문자열을 넘겨주면된다. flush() 메소드는 아직 파일로 쓰여지지 않고 버퍼링되어있는 fileWirte 객체 내부의 버퍼를 비우겠다는 의미이다.
마찬가지로 쓰기를 모두 끝마치면 close() 메소드로 파일 리소스를 정리해줘야한다.
댓글