java에서 FileOutputStream 과 FileOutputStream을 감싸는 FilterOutputStream를 이용해서 파일을 저장할 때가 있을 때 보통 FilterOutputStream만 flush와 close() 메서드 콜만 하고 끝나는 경우의 코드들이 있다.

그러나 좀 더 확실히 하기 위해서는 FileOutputStream 의 getFD() 메소드를 호출하여 FileDescriptor 를 꺼집어 내서 sync() 메서드 콜을 해야 함으로 안정하게 sync 해야 physical device에 데이터가 저장된다.

flush는 그냥 버퍼를 비우는 것 뿐이고, sync 는 파일시스템 내부의 캐쉬를 모두 physical device로 가는 것이다. 확실히 저장시키는 습관이 필요하다. 

 

1. 일반 IO의 경우는 아래와 같이 사용한다.

FileOutputStream fos = new FileOutputStream(“file.db”);
DataOutputStream stream = new DataOutputStream(fos);
stream.write(1); 
stream.flush();
fos.getFD().sync();
stream.close();

-------------------------------

2. NIO의 경우는 아래와 같이 사용한다.

FileOutputStream s = new FileOutputStream(filename) ;
Channel c = s.getChannel() ;
c.write(buffer);
c.force(true) ;
s.getFD().sync() ;
c.close() ;

Posted by '김용환'
,