2012/01/22

Android:確実にファイル保存する方法

ファイルへの書き込みには一般的にflushメソッドを使用しますが、flushメソッドは実際
にファイルシステムへ書き込むわけではありません。
ストリームのフラッシュはOSのファイル出力バッファに書き込まれます。
そのため、実ファイル上に書き込まれている保証はこの時点ではありません。

Javaにはアプリからの書き込みをファイルシステムと同期させるための仕組みが用意され
ています。
ファイルシステムとの同期にはFileDescriptorクラスのsyncメソッドを使用します。
FileDescriptorはファイルストリームのgetFDメソッドから取得することが可能です。
参考:http://java.sun.com/javase/ja/6/docs/ja/api/java/io/FileOutputStream.html#getFD()

コード例
FileOutputStream out = new FileOutputStream(new File(foo));
out.write(bar);
out.flush();
out.getFD().sync();
out.close();
このテクニックはFileUtils.copyFileメソッドでも使用されています。
※ファイルシステムとの同期はパフォーマンスを大きく低下させる恐れがあります。
 そのため、頻繁にsyncメソッドを呼ぶのは避けるべきです。

以上です。