InputStream.read
手段によって返される0(読み取られたバイト数)は何ですか?この状況に対処する方法は?
更新:read(byte[] b)
つまりread(byte[] b, int off, int len)
、読み取られたバイト数を返すメソッドを意味します。
InputStream.read
手段によって返される0(読み取られたバイト数)は何ですか?この状況に対処する方法は?
更新:read(byte[] b)
つまりread(byte[] b, int off, int len)
、読み取られたバイト数を返すメソッドを意味します。
aが呼び出しからInputStream
戻る可能性がある唯一の状況は、渡された長が0の場合です。0
read(byte[])
byte[]
byte[] buf = new byte[0];
int read = in.read(buf); // read will contain 0
JavaDocのこの部分で指定されているように:
bの長さがゼロの場合、バイトは読み取られず、0が返されます。
私の推測:あなたavailable()
はバッファがどれくらいの大きさであるかを見ていました、そしてそれは戻り0
ました。これはの誤用であることに注意してくださいavailable()
。JavaDocは、次のように明示的に述べています。
このメソッドの戻り値を使用して、このストリーム内のすべてのデータを保持することを目的としたバッファーを割り当てることは決して正しくありません。
javax.sound.AudioInputStream#read(byte [] b、int off、int len)...yuckの実装を見てください。これらは標準のjava.io.InputStreamセマンティクスに完全に違反しており、データのフレーム全体よりも少ない数を要求した場合、読み取りサイズ0を返します。
残念ながら、一般的なアドバイス(およびAPI仕様)では、len> 0の場合にゼロの戻りを処理する必要がないはずですが、JDKが提供するクラスの場合でも、任意のタイプのInputStreamに対してこれが当てはまると普遍的に信頼することはできません。
繰り返しますが、うん。
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の実際の実装に依存します!!! (間違っている可能性があります)
次のコードを使用して、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を読み取ります。読み取られたデータがコンソールウィンドウに配置され、結果が何らかの形で競合状態になりました。結果を無視し、コンソールウィンドウを更新しないことで、問題が解決しました。