安全にファイルを操作する

AtomicFile

API level 17からファイルを安全に操作するための仕組みとしてAtomicFileが導入された。 これは書き込み開始時に元ファイルをバックアップし、失敗時にはロールバックすることでファイルの破損を防ぐ仕組みだ。 SupportLibraryにもr11から追加されているため、古い機種でも利用することができる。 http://developer.android.com/reference/android/support/v4/util/AtomicFile.html

メソッド

openRead

ファイル読み込みのためのFileInputStreamを取得する 前回のバックアップファイルが残っている場合、不正終了とみなして自動的にロールバックする

readFully

openReadした内容をbyte[]で取得する

startWrite

ファイルの編集を行うためのFileOutputStreamを生成する 元ファイルが存在する場合はバックアップを生成する

finishWrite

ファイルの操作成功時に呼び出すメソッド バックアップファイルを削除する 引数のFileOutputStreamは内部でcloseされる

failWrite

ファイルの操作失敗時に呼び出すメソッド バックアップファイルからロールバックを行う 引数のFileOutputStreamは内部でcloseされる

delete

元ファイル、バックアップファイルの両方を削除する この処理ではstartWriteは必須ではない

getBaseFile

元ファイルのFileを返す

実装

AtomicFile atomicFile = new AtomicFile(getFileStreamPath(FILENAME));
FileOutputStream fos = null;
try {
    // 書き込み開始
    fos = atomicFile.startWrite();

    fos.write(...);

    // 書き込み成功
    atomicFile.finishWrite(fos);
} catch (IOException ex) {
    // 書き込み失敗
    atomicFile.failWrite(fos);
}

補足

バックアップ処理は元ファイル名の末尾に.bakをつけたパスにrenameToしているようだ。 容量は食わないがコピーしているわけではないので、startWriteした後に元ファイルを参照したりしないように注意すること。