安全にファイルを操作する
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
した後に元ファイルを参照したりしないように注意すること。