8

の違いは何ですか

byte[] buffer = new byte[1024];
// this:
if (inputStream.read(buffer) > 0) { /*...*/ }
// and:
if (inputStream.read(buffer) != -1) { /*...*/ }

両方がネットワークストリームの終了を判断できますか?

4

3 に答える 3

11

たとえば、Javadoc InputStream.read()

の長さbがゼロの場合、バイトは読み取られず、0が返されます

通常の使用では、これは決して起こらないはずなので、この状態を明示的にテストする意味はあまりありません。(この状況でバッファーの長さがゼロでフェイルファストであるために永久にループしないようにしたい場合は、バッファーの長さをテストするだけです。)

さらに、次のようなものがあります。

戻り値:バッファに読み込まれた合計バイト数、または-1ストリームの終わりに達したためにデータがなくなった場合。

ファイルの終わり(またはネットワークストリームなど)をテストする場合は、次のテストを使用します。

if ( inputStream.read(buffer) != -1 ) ...

バギーでないJava実装は、利用可能なデータがこれ以上ないことを示すために他に何も返すことはありません。

于 2012-09-17T13:54:00.060 に答える
2

バッファ長がゼロでないことがすでにわかっている場合、これら2つの式の間に効果的な違いはありません。有効なバッファに関するこの基本的な規定を考えると、決して返されないドキュメントから推測できます。read0

このメソッドは、入力データが使用可能になるか、ファイルの終わりが検出されるか、例外がスローされるまでブロックします。

于 2019-02-28T21:37:03.773 に答える
0

ドキュメントによるとinputstream.read(buffer) !=-1、ストリームが終了したことが通知されます。inputstream.read(buffer) == 0読み取ることができるバイトがないが、ストリームはまだアクティブであるとだけ言っています(つまり、最後に可能な限りすべてを読み取ってから、ピアは何も送信していません)。

于 2012-09-17T13:50:22.073 に答える