이번 예제는 BufferedOutputStream 클래스에 대한 예제 입니다. 이 클래스는 버퍼링된 출력 스트림을 구현합니다. 이렇게 출력 스트림을 설정하게 되면 어플리케이션에서는 각각의 바이트를 쓰기 위해 시스템을 호출 하지 않고 여러개의 바이트를 기본이 되는 출력 스트림에 작성 할 수 있습니다.
BufferedOutputStream 클래스는 FilterOutputStream 클래스를 확장하였으며 FilterOutputStream 은 출력 스트림을 필터 처리 하는 모든 클래스의 상위 클래스입니다. 이러한 스트림은 기본적인 데이터의 sink 로 사용하기 위한 기존에 이미 존재하는 출력 스트림 (기본이 되는 출력 스트림)의 최상위에 있습니다. 다만, 데이터를 도중에 변경하는것이나 추가 기능을 제공하는 경우도 있습니다.
BufferedOutputStream 클래스는 JDK 1.0 부터 도입 되었습니다.
BufferedOutputStream 클래스의 기본 구조.
생성자
- 기본이 되는 출력 스트림에 데이터를 작성 하기 위한 버퍼링 된 출력 스트림을 생성합니다.
- 기본이 되는 출력 스트림에 데이터를 작성 하기 위한 버퍼링 된 출력 스트림을 지정된 버퍼 사이즈로 생성합니다.
BufferedOutputStream 예제-1
다음 소스를 통해 어떻게 BufferedOutputStream 클래스를 이용하여 파일을 작성하는지 살펴 보겠습니다.
package kr.co.leehana.example.bufferedoutputstream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class BufferedOutputStreamBasicExample { public static void main(String[] args) { BufferedOutputStream stream = null; try { stream = new BufferedOutputStream(new FileOutputStream("out.txt")); stream.write("Hello, World!".getBytes()); stream.write(System.getProperty("line.separator").getBytes()); stream.write("I am writting into a file using BufferedOutputStream" .getBytes()); stream.write(System.getProperty("line.separator").getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
BufferedOutputStream 클래스에는 두개의 write() 메소드가 존재 합니다.
위 예제에서는 write(byte[] b) 를 사용하였는데 이것은 상위 클래스인 FilterOutputStream 클래스의 메소드 입니다. 또한 위 예제에서 사용한 write() 메소드는 바이트배열을 인자로 받기 때문에 getByte() 메소드를 강제로 호출 하였습니다.
항상 기억해야 하는것은 BufferedOutputStream 인스턴스의 사용이 끝났을 때 혹은 더이상 작성할 내용이 없을 때에는 close() 메소드를 호출해야 한다는것입니다.
BufferedOutputStream 예제-2
이번에는 BufferedOutputStream 클래스를 이용하여 파일에 로깅을 기록하는 예제를 살펴 보겠습니다.
먼저 Logger 클래스를 작성합니다.
package kr.co.leehana.example.bufferedoutputstream; import java.io.FileNotFoundException; import java.io.IOException; public class BufferedOutputStreamLoggingExample { public static void main(String[] args) { Logger logger = null; try { logger = new Logger("out.log"); logger.log("Log message 1"); logger.log("Log message 2"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (logger != null) { try { logger.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
다음은 위 Logger 클래스를 테스트 하기 위해 main 메소드가 포함된 테스트 클래스를 살펴 보겠습니다.
package kr.co.leehana.example.bufferedoutputstream; import java.io.FileNotFoundException; import java.io.IOException; public class BufferedOutputStreamLoggingExample { public static void main(String[] args) { Logger logger = null; try { logger = new Logger("out.log"); logger.log("Log message 1"); logger.log("Log message 2"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (logger != null) { try { logger.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
출력된 파일을 열어보면 두줄로 쓰여진 로깅 내용을 확인 할 수 있을 것입니다.
BufferedOutputStream 에 대한 추가 내용
BufferedOutputStream 클래스는 직접적으로 출력 스트림에 쓰지 않습니다. 당연하겠지만 이 클래스는 더 나은 성능으로 스트림에 쓰기 위해 버퍼에 먼저 쓰게 됩니다. 한가지 기억할 것은 버퍼의 크기를 생성자에 넘겨 줄 수 있다는것입니다. 만약 아무값도 넘기지 않으면 기본값(8192)으로 설정됩니다. close() 메소드를 호출하면 버퍼의 내용을 스트림에 쓰게 됩니다. 이것을 확인 하기 위해close() 메소드를 호출 하지 않으면 파일에는 아무것도 쓰지 않게 됩니다.
만약 스트림을 닫지 않고 버퍼의 내용을 파일에 쓰고 싶을때에는 flush() 메소드를 호출 하면 됩니다. 만약 close() 메소드를 호출 한뒤 write() 나 flush() 메소드를 호출하게 되면 IOException 이 발생합니다.
마지막으로 BufferedOutputStream 클래스의 모든 메소드는 IOException 이 발생 할 수 있기 때문에 BufferedOutputStream 클래스의 메소드들을 이용할때에는 try-catch 를 사용해야 합니다.
소스코드
참조
'공부 > java' 카테고리의 다른 글
Java List remove object 예제 (0) | 2014.09.23 |
---|---|
java.lang.System 예제 (0) | 2014.09.22 |
Java BufferedWriter 예제 (0) | 2014.09.06 |
Java List 를 배열로 변환 하는 예제 (0) | 2014.09.05 |
Java FileWriter 예제 (0) | 2014.09.05 |