BufferedWriter 클래스에 대하여 간단한 예제를 통해 알아보려고 합니다.
BufferedWriter 클래스는 문자들을 버퍼링하여 문장, 배열, 단일 문자를 효율적으로 문자 출력 스트림(character output stream) 에 기록합니다. BufferedWriter 클래스는 문자 스트림에 기록하기 위해 추상 클래스인 Writer 를 상속하였습니다. 서브 클래스들은 반드시 write(char[] cbuf, int off, int len), flush(), close() 메소드를 구현해야 합니다. 대부분의 서브 클래스들은 더 높은 효율성, 기능의 추가, 혹은 양쪽 모두를 제공하기 위해 일부 메소드들을 오버라이드 (override) 하기도 합니다.
BufferedWriter 클래스는 JDK 1.1 부터 존재했습니다.
BufferedWriter 의 생성자 구조
기본 크기를 가지는 출력 버퍼로 버퍼링 된 문자형 출력 스트림 (character output stream) 객체를 만듭니다.
매개변수로 주어진 크기를 가지는 출력 버퍼로 버퍼링된 문자형 출력 스트림 객체를 만듭니다.
BufferedWriter 의 기본 예제
BufferedWriter 클래스가 어떻게 파일에 문자를 기록하는지 살펴 보겠습니다.
package kr.co.leehana.example.bufferedwriter; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class SimpleBufferedWriterExample1 { public static void main(String[] args) { String greetings = "Hello!!!"; String description = "I am written into a file"; BufferedWriter writer = null; try { writer = new BufferedWriter(new FileWriter(new File("output.txt"))); writer.write(greetings); writer.newLine(); writer.write(description); } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
BufferedWriter 는 매개변수로 Writer 클래스를 가지고 오고 예제에서는 Writer 추상 클래스를 상속한 OutputStreamWriter 의 서브클래스인 FileWriter 클래스를 사용하였습니다. 중간에 writer.newLine() 메소드를 사용하였는데 이는 플랫폼 (Mac, Linux, Windows) 의 시스템 환경변수에 등록된 line.separator 를 사용하여 호환성을 높였습니다. 여기에서 중요한 것은 마지막에 호출된 close() 메소드 입니다. 항상 기억해야 할것은 파일에 쓰기가 완료되면 close() 메소드를 반드시 호출 해줘야 한다는 것입니다.
생성된 파일을 열어보면 위에서 입력한 두줄의 텍스트가 있는것을 확인 할 수 있을 것입니다.
BufferedWriter 의 또 다른 예제
BufferedWriter 의 flush() 메소드를 사용하는 Logger 클래스를 만들어서 log 파일을 생성하는 예제 입니다.
package kr.co.leehana.example.bufferedwriter; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Date; public class Logger { private BufferedWriter writer; public Logger(String filename) throws IOException { this.writer = new BufferedWriter(new FileWriter(new File(filename))); } public Logger(File logFile) throws IOException { this.writer = new BufferedWriter(new FileWriter(logFile)); } public void log(String s) throws IOException { String date = new Date().toString(); this.writer.write(date + " : " + s); this.writer.newLine(); this.writer.flush(); } public void close() throws IOException { this.writer.close(); } }
위 Logger 클래스를 테스트 하는 예제 코드 입니다.
package kr.co.leehana.example.bufferedwriter; import java.io.IOException; public class SimpleBufferedWriterExample2 { public static void main(String[] args) { Logger logger = null; try { logger = new Logger("log.txt"); logger.log("Test 1"); logger.log("Test 2"); } catch (IOException e) { e.printStackTrace(); } finally { if (logger != null) { try { logger.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
출력된 log 파일을 열어보면 하나의 로그 파일에 두줄의 로그가 기록된것을 확인 할 수 있을 것입니다.
BufferedWriter 클래스에 대한 추가 정보
BufferedWriter 클래스를 다음과 같이 생성함으로써 출력 스트림에 쓸 수도 있습니다.
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedWriter 클래스는 직접 출력 스트림 (output stream) 에 쓰지 않습니다. 사실 BufferedWriter 클래스는 더 나은 성능을 위해 스트림에 기록되는 버퍼 입니다. 기억해야 할만한것으로는 생성자의 매개변수로 버퍼의 크기를 지정할 수 있다는것과 지정하지 않으면 기본 크기를 가지는 버퍼를 사용한다는 것입니다. close() 메소드가 호출되면 버퍼가 기록되는것이 아니고 스트림에 기록됩니다. 이를 확인 하기 위해서 close() 메소드를 주석처리해서 실행 해보면 파일에 아무것도 기록되지 않은것을 확인 할 수 있습니다.
만약 스트림을 닫지 않고 버퍼를 파일에 계속 쓰고 싶으면 flush() 메소드를 사용하면 됩니다. close() 메소드가 호출된 후 write() 메소드나 flush() 메소드를 호출 하게 되면 IOException 이 발생합니다.
마지막으로 모든 메소드는 IOException 이 발생 할 수 있으니 try catch 문을 이용해야 합니다.
소스코드
출처
'공부 > java' 카테고리의 다른 글
java.lang.System 예제 (0) | 2014.09.22 |
---|---|
Java BufferedOutputStream 예제 (0) | 2014.09.22 |
Java List 를 배열로 변환 하는 예제 (0) | 2014.09.05 |
Java FileWriter 예제 (0) | 2014.09.05 |
RejectedExecutionException 해결 방법 알아보기 (0) | 2014.09.03 |