공부/java2014. 9. 5. 09:44

FileWriter 클래스가 어떻게 문자 스트림을 사용하는지에 대해 알아 보겠습니다. 기본적으로 파일을 사용할 수 있는지 혹은 생성이나 삭제가 가능 할지는 플랫폼(MAC, Linux, Windows ETC) 에 따라 달라집니다. 일부 플랫폼들은 특별히 파일을 쓰기 위해 여는 작업을 한번에 오직 하나의 FileWriter 객체를 사용 할 수 있습니다. 이러한 상황에에서는 관련된 파일이 이미 열려 있는 경우 FileWriter 생성자 호출은 실패 하게 됩니다.

FileWriter 클래스는 OutputStreamWriter 클래스를 확장하며 문자 스트림과 바이트 스트림 사이에 다리 역활을 합니다. 여기에 기록된 문자는 지정된 캐릭터셋을 이용하여 바이트로 인코딩 됩니다. 이 캐릭터셋은 지정된 이름을 사용하거나 명시적으로 부여 할 수 있고 또는 플랫폼들의 기본 캐릭터셋을 사용하게 됩니다.

FileWriter 클래스는 JDK 1.1 부터 존재 했습니다. 

FileWriter 클래스 구조

생성자
  • FileWriter(File file)
    File 객체를 매개변수로 넘겨 FileWriter 객체를 생성합니다.


  • FileWriter(File file, boolean append)
    File 객체를 매개변수로 넘겨 FileWriter 객체를 생성합니다. 만약 두번째 매개변수값이 true 이면 파일의 마지막 다음 줄 첫번째에 바이트를 쓰게 됩니다.


  • FileWriter(FileDescriptor fd)
    File descriptor 와 관련된 FileWriter 객체를 생성합니다.


  • FileWriter(String filename)
    지정된 파일이름으로 FileWriter 객체를 생성합니다.


  • FileWriter(String filename, boolean append)
    지정된 파일이름으로 FileWriter 객체를 생성합니다. 만약 두번째 매개변수값이 true 이면 파일의 마지막 다음 줄 첫번째에 바이트를 쓰게 됩니다.

FileWriter 예제를 살패 보겠습니다

FileWriter 의 기본적인 사용 예제 입니다.

package kr.co.leehana.example.filewriter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class SimpleFileWriterExample {

	private static final String LINE_SEPARATOR = System
			.getProperty("line.separator");

	// jdk 7
	// private static final String LINE_SEPARATOR = System.lineSeparator();

	public static void main(String[] args) throws IOException {
		String name = "Hana Lee";
		int age = 37;
		double temp = 27.3d;
		FileWriter fw = null;

		try {
			fw = new FileWriter(new File("textfile.txt"));

			fw.write(String.format("My name is %s.", name));
			fw.write(LINE_SEPARATOR);
			fw.write(String.format("I am %d years old.", age));
			fw.write(LINE_SEPARATOR);
			fw.write(String.format("Today's temperature is %.2f.", temp));
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fw != null)
				fw.close();
		}
		
		System.out.println("Done");
	}
}

예제에서 매개변수로 새로운 File 객체를 만들어 전달하여 FileWriter 객체를 생성하고 파일에 문자를 쓸때 System.lineSeparator 를 사용하여 줄바꿈을 해줬습니다. 파일에 더 이상 쓸 내용이 없을때 FileWriter 객체의 close 메소드를 호출 하여 닫아 주었습니다.
textfile.txt 파일을 열어보면 소스상에 적용된 문자가 입력되어 있는것을 확인 할 수 있습니다.

FileWriter 의 append 에 대한 예제 입니다.

FileWriter 의 append 매개변수 사용방법에 대한 예제 입니다. 이 예제에서 간단한 Logger 객체를 만들어서 로그 데이터를 파일에 작성하겠습니다.

package kr.co.leehana.example.filewriter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

public class Logger {
	private static final String LINE_SEPARATOR = System
			.getProperty("line.separator");
	private File logFile;

	public Logger() {
	}

	public Logger(String fileName) {
		this.logFile = new File(fileName);
	}

	public Logger(File logFile) {
		this.logFile = logFile;
	}

	public void log(String str) {
		FileWriter fw = null;
		try {
			fw = new FileWriter(this.logFile, true);
			String date = new Date().toString();
			fw.write(date + " : " + str);
			fw.write(LINE_SEPARATOR);
		} catch (IOException e) {
			System.err.println("Couldn't log this : " + str);
		} finally {
			if (fw != null) {
				try {
					fw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

아래 클래스는 Logger 객체를 생성하고 log 메소드를 호출할때 로그 데이터를 매개변수로 넘겨 파일에 로그 데이터를 쓰는 작업을 하게 됩니다.
Logger 객체를 생성할때 두가지 다른 생성자를 만들어서 테스트 해볼 수 있는 예제 입니다.

package FileWriterAppendExample;

import java.io.File;

import kr.co.leehana.example.filewriter.Logger;

public class FileWriterAppendExample {

	public static void main(String[] args) {
		Logger log1 = new Logger("file1.log");

		File logFile = new File("file2.log");
		Logger log2 = new Logger(logFile);

		log1.log("This is written in the first file");
		log2.log("This is written in the second file");

		log1.log("This is appended to the first file");
		log2.log("This is appended to the second file");
	}
}

추가 정보

FileWriter 클래스의 모든 생성자들은 매개변수로 넘어온 File 객체나 파일이름이 이미 존재 하면서 디렉토리 일때 혹은 파일 생성이 되지 않거나 어떤 이유로 파일 열기가 되지 않을 경우 IOException 오류가 발생합니다.




소스 코드

출처


'공부 > java' 카테고리의 다른 글

Java BufferedWriter 예제  (0) 2014.09.06
Java List 를 배열로 변환 하는 예제  (0) 2014.09.05
RejectedExecutionException 해결 방법 알아보기  (0) 2014.09.03
예외  (0) 2014.06.20
POJO  (0) 2014.06.10
Posted by #HanaLee