5

ファイルの終わりに到達したことを示すために例外を使用するのは汚いようです。私たちが読むすべてのファイルには終わりがあるので、例外的または予期しないものではないようです。さらに、プログラムの非例外的なフローに例外を使用するのは好きではありません。

java.io.EOFExceptionを使用してデータ入力ストリームの終了を通知することについて話しています。

次のメッセージで構成されるファイルを想像してください...

----------------- ------------------
- 2-byte LENGTH - - N-byte PAYLOAD - , where N = LENGTH;
----------------- ------------------

...そしてDataInputStreamでこのファイルを読む:

DataInputStream in = new DataInputStream(...);

...

try {
    while (true) {
        short length = in.readShort();
        byte[] b = new byte[length];
        in.readFully(b);
    }
} catch (EOFException e) { }

...

この例では、 への呼び出しによって EOFException がスローされin.readShort()ます。ファイル内のバイト数を把握し、正確にそのバイト数 (total -= lengthゼロになることによって決定) を読み取り、例外なく while ループを終了する必要がありますか? 私はベストプラクティスを探しています。

私はこのようなことをすべきですか?

long total = file.length();
while (total > 0) {
    short length = in.readShort();
    total -= length;
    byte[] b = new byte[length];
    in.readFully(b);
}

API 仕様では、EOFException は、入力中に予期せずファイルの終わりまたはストリームの終わりに到達したことを通知することを指定しています。ただし、データ入力ストリームでもストリームの終わりを知らせるために使用されます。

例外が予想される場合はどうすればよいですか?

4

3 に答える 3

2

メソッドについては、 API 仕様を参照してください。DataInput.readFully

 This method blocks until one of the following conditions occurs:

    * b.length bytes of input data are available, in which case a normal return is made.
    * End of file is detected, in which case an EOFException is thrown.
    * An I/O error occurs, in which case an IOException other than EOFException is thrown.

つまり、b.length バイトのデータを読み取るか、I/O エラーまたは b.length バイトを読み取る前にファイルの終わりに達したためにそれができない場合はエラーが発生するという考えです。

したがって、 を呼び出す前に、読み取るバイト数を知っている必要がありますDataInput.readFully。ファイルの末尾を超えた場合、それは異常な動作と見なされるため、例外が発生する理由になります。

于 2010-07-27T16:03:22.840 に答える
0

その名前が示すようにreadFully、既知の長さのバイトの束を完全に読み取ることが期待される場合に使用されます。前に EOF に達した場合、それは予想外であり、例外をスローすることは概念的に正しいことです。readセマンティックが必要な場合は、 readメソッドを使用します。

于 2010-07-27T16:07:35.783 に答える