空っぽのファイルができる!
以下のコードを実行すると、ぱっと見はファイルができています。取り外して別のPCで見ると中身が空っぽになります。
FileOutputStream fout = new FileOutputStream("path to removable disk");
byte[] data = new byte[4096];
fout.write(data);
fout.flush();
fout.close();
何が起きているか
リムーバブルディスクへの書き込みが遅延書き込みモードになっており、書き込まれたデータはディスクではなくバッファに存在しています。書き込んだ環境のファイルシステム上では、見た目上では保存されているように見えますが、正しく書き込むためには同期を行う必要があります。
同期
ファイルディスクリプタを取得してsyncメソッドを呼び出せばOKです。
FileOutputStream fout = new FileOutputStream("path to removable disk");
byte[] data = new byte[4096];
fout.write(data);
fout.flush();
fout.getFD().sync();//ここを追加
fout.close();
注意
最近のUSBメモリはそこそこに速いですが、物理的に書き込むのは決して速い処理ではありません。
さらに最近のUSBメモリは内部のチップによるウェアレベリングによって書き込みが分散されますが、それでも書き込み回数には制限があり同期によってNAND素子を1つ減らすことになります。
同一ファイルに対する読み書きが複数回あるならば、全てが終わった後に同期を行うべきで、同期を乱用してはいけません。