2011-10-29 16 views
5

大きなファイルをSDカードに保存するアンドロイドアプリを作成しました。場合によっては、書き込み操作中にファイルが破損状態になる原因となるIOExceptionが発生することがあります。この質問への回答に基づいて:ファイルをアンドロイドでディスクに安全に保存する方法は?

Question: How to safely write to a file?

私が使用すべき戦略は、一時ファイルを作成し、書き込みが完了した後、このファイルをコピーすることです。私の質問は次のとおりです:

1)これはAndroidで最も安全な方法ですか? (例えば、アンドロイドのSDカードにファイルをコピーすることができますか?そうすれば操作アトミックですか?)

2)限られたリソース(ディスク容量)を持つ組み込みシステムでは、ディスクに安全に書き込むための別の戦略を知っていますか?安全に最も合理的なプラットフォーム上のファイルを作成するために

おかげ

+0

申し訳ありませんが、私はあなたの質問に誤解しました。私は自分の答えを取り除いた。 –

答えて

10

典型的な方法(代わりに二つの大きなファイルを作成する)一時ファイル、その後名前の変更を作成することです(のLinux/Androidのそのうちの一つがあります)あなたがリンクした質問&の質問に記載されているように、ファイル。 に重点を置き、という名前に注意してください。ファイルの名前を変更すると、同じファイルシステム内のが通常アトミック操作になります。コピーするファイルはありません。さらに、この方法では、データの単一コピーに対して十分なスペースしか必要としません。

したがって、一時ディレクトリ名にファイルを作成し、File.renameTo()を使用して適切な名前を付けます。一時ファイルの標準命名規則を使用すると、たとえアプリケーションが予期せず終了したとしても、いつでもそれらを見つけて削除することができます。デバイスの電源を切る。

あなたは本当に被害妄想している場合、あなたはFileDescriptor.sync()または同等に、いくつかの呼び出しを挿入することもできますが...

EDIT:

ところで、あなたはあなたが取得しているかどうかされているIOExceptionの種類を言及していませんあなたはその原因を追跡しました。スペースが不足している場合は問題ありませんが、障害のあるSDカードについて話している場合、この場合は「安全」なものはありません。

EDIT 2:

可能な空き容量を確認するために、あなたは先のディレクトリ(ファイルが終わるだろうつまりディレクトリ)のためFileオブジェクトを作成し、File.getFreeSpace()を呼び出すことができます。このチェックは保証を提供するものではないことにご留意ください。別のプロセスがデータを媒体に書き込む。

+0

明確な答えをありがとう。名前の変更は非常に意味がある、私は他の質問でそれを逃した。 – brif

+0

名前を変更すると、答えのように間違いなく聞こえます。しかし、私はあなたが書く準備をしているファイルのSD上に十分な空き領域があるかどうかを確認することができますか? – Jeff

+0

@Jeff:もっと明白なケースを避けるために、['File.getFreeSpace()'](http://developer.android.com/reference/java/io/File.html#getFreeSpace%28%29)を呼び出すことができますスペースが足りません。 – thkala

0

私はそれをコピーするかどうか分かりませんが、一時ファイルの名前を変更するのが一般的です。書き込み中に例外が発生した場合は、一時ファイルを削除してください。

3

私はこれがあまりにも遅いと知っていますが、これを知る人は助けになるでしょう。

AtomicFileを使用する必要があります。

次のコードスニペットが役立ちます。

private void writeFile(File file, byte[] data) { 
    file.mkdirs(); 
    try { 
     AtomicFile aFile = new AtomicFile(file); 
     FileOutputStream fos = aFile.startWrite(); 
     fos.write(data); 
     aFile.finishWrite(fos); 
    } catch (IOException ioe) { 
     Log.e(TAG, "Cannot write file " + file.getPath()); 
    } 
} 
関連する問題