13

InputStream.read手段によって返される0(読み取られたバイト数)は何ですか?この状況に対処する方法は?

更新:read(byte[] b)つまりread(byte[] b, int off, int len)、読み取られたバイト数を返すメソッドを意味します。

4

4 に答える 4

17

aが呼び出しからInputStream戻る可能性がある唯一の状況は、渡された長が0の場合です。0read(byte[])byte[]

 byte[] buf = new byte[0];
 int read = in.read(buf); // read will contain 0

JavaDocのこの部分で指定されているように:

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

私の推測:あなたavailable()はバッファがどれくらいの大きさであるかを見ていました、そしてそれは戻り0ました。これはの誤用であることに注意してくださいavailable()。JavaDocは、次のように明示的に述べています。

このメソッドの戻り値を使用して、このストリーム内のすべてのデータを保持することを目的としたバッファーを割り当てることは決して正しくありません。

于 2010-02-23T15:49:47.773 に答える
10

javax.sound.AudioInputStream#read(byte [] b、int off、int len)...yuckの実装を見てください。これらは標準のjava.io.InputStreamセマンティクスに完全に違反しており、データのフレーム全体よりも少ない数を要求した場合、読み取りサイズ0を返します。

残念ながら、一般的なアドバイス(およびAPI仕様)では、len> 0の場合にゼロの戻りを処理する必要がないはずですが、JDKが提供するクラスの場合でも、任意のタイプのInputStreamに対してこれが当てはまると普遍的に信頼することはできません。

繰り返しますが、うん。

于 2011-09-16T07:08:02.960 に答える
3

Java API Docによると:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#read(byte [])

これは、渡したbyte []の項目がゼロ(新しいbyte [0])の場合にのみ発生する可能性があります。

他の状況では、少なくとも1バイトを返す必要があります。または、EOFに達した場合は-1。または例外。

もちろん:それはあなたが使用しているInputStreamの実際の実装に依存します!!! (間違っている可能性があります)

于 2010-02-23T15:50:44.120 に答える
0

次のコードを使用して、swingコンソールの出力ウィンドウを作成し、stdoutとstderrのリーダースレッドを作成したときに、同じ動作(0バイトの読み取り)が観察されました。

                this.pi = new PipedInputStream();
                po = new PipedOutputStream((PipedInputStream)pi);
                System.setOut(new PrintStream(po, true));
「main」swingアプリケーションが終了し、コンソールウィンドウがまだ開いている場合、this.pi.read()から0を読み取ります。読み取られたデータがコンソールウィンドウに配置され、結果が何らかの形で競合状態になりました。結果を無視し、コンソールウィンドウを更新しないことで、問題が解決しました。

于 2012-07-04T10:57:45.640 に答える