본문 바로가기
프로그래밍 언어/JAVA

FileOutputStream을 활용한 안전한 파일 저장 방법

by DGDD(Developer) 2023. 6. 19.

FileOutputStream은 데이터를 바이트 단위로 파일에 기록하는 Java 클래스입니다. 텍스트 파일, 이미지 파일 등 다양한 유형의 파일에 데이터를 저장할 때 사용됩니다. store(), flush(), sync() 메소드를 사용하여 데이터 손실을 방지할 수 있습니다.

store()와 flush() 메소드

  • store(): 데이터를 임시 버퍼에 기록합니다.
  • flush(): 버퍼에 남아 있는 데이터를 강제로 파일에 기록하여 데이터 손실을 방지합니다.

sync() 메소드

  • sync(): 데이터가 물리적 디스크에 안전하게 기록되었는지 확인합니다.

flush()와 sync() 메소드의 차이점

flush() 메소드

  • 역할: 버퍼에 남아 있는 데이터를 강제로 출력 스트림에 기록합니다.
  • 사용 목적: 데이터 손실을 방지하고, 즉시 데이터를 전송하기 위해 사용됩니다.
  • 예시: 네트워크 전송, 파일 저장 등에서 버퍼링된 데이터를 강제로 보내야 할 때 사용합니다.

sync() 메소드

  • 역할: 파일 시스템의 모든 내부 버퍼가 디스크에 기록되도록 보장합니다.
  • 사용 목적: 데이터의 일관성과 안정성을 보장하기 위해 디스크에 안전하게 데이터를 기록합니다.
  • 예시: 중요 데이터 저장 시, 시스템 장애나 전원 손실이 발생해도 데이터를 보호할 때 사용합니다.
try (FileOutputStream fos = new FileOutputStream("example.xml")) {
    transformer.transform(source, new StreamResult(fos));
    fos.flush(); // 버퍼에 남아 있는 데이터를 강제로 기록
    fos.getFD().sync(); // 디스크에 안전하게 기록되었는지 확인
} catch (IOException e) {
    e.printStackTrace();
}

 

기존에 flush까지 사용했을 때 특정 상황에 데이터가 저장되지 않는 현상을 겪으셨다면 getFD().sync()까지 사용해서 디스크에 강제 저장되도록 해보시는 것도 추천합니다.