13

私のアプリは、大量のバイトを常にファイルに書き込みます。コードのブロックがバイトを書き込んでいて、ドライブまたはネットワークへの接続が失われた場合にIOExceptionが発生した場合、どのようにしてそれが何バイトを書き込んだかを知ることができますか?

たとえば、一度に2500バイトを書き込んでいて、IOExceptionが発生した場合、それはファイルに何も書き込んでいないことを意味しますか、それともファイルに部分的なバイトを書き込んでいたことを意味しますか?部分バイトがファイルに書き込まれる場合、どのように書き込まれるかを知るにはどうすればよいですか?

参考までに使用しています

DataOutputStream

ファイルを書き出す。アプリが閉じたときにのみフラッシュします。

4

2 に答える 2

6

IOExceptionいつでも起こりえます。考えてみるとIOException、最初のバイトが書き込まれる前、すべてが書き込まれた後に接続に何かが発生した後、またはデータチャンクがかなり大きい場合は途中で、いつでもソフトウェアまたはハードウェアの障害によって引き起こされる可能性があります。

再接続後、ファイルのサイズを確認するか、他の手法を使用してファイルを一貫した状態に保ち、回復する必要があります。最も単純なセーフティ ネット: データを書き込む前にファイル サイズを読み取って確実に保存し、データを書き込み、書き込み後にファイル サイズを読み取る。エラーが発生し、現在のファイル サイズが予想されるファイル サイズ (最後に保存されたもの) と等しくない場合は、余分なバイトを切り捨てて再試行します。

リレーショナル データベースのトランザクション ログについて読んで、大規模で信頼性の高いソフトウェアがこのようなケースをどのように処理するかを確認してください。

于 2012-07-26T14:09:42.740 に答える
1

書き込みがどのように失敗するかによって異なりますが、InterruptedIOException が探しているものである可能性があります。

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InterruptedIOException.html

「bytesTransferred」のフィールドが含まれています。「中断される前に I/O 操作の一部として転送されたバイト数を報告します。」

于 2012-07-26T14:11:46.363 に答える