7

空の InputStream をどのようにテストしますか? 私は、InputStream がリモート リソースで動作するように設計されていることを知っています。そのため、実際に読み取るまで、そこにあるかどうかを知ることはできません。現在の位置が変更され、mark() を使用してリセットするのは不適切なように思われるため、read() を使用できません。

問題は、read() が -1 を返すかどうかをテストできない場合があることです。これは、ストリームがあり、サードパーティのライブラリがそれを使用している場合、そこに送信する前に空かどうかをテストする必要があるためです。

空の InputStreams とは、これらを意味しますnew ByteArrayInputStream(new byte[0])

4

2 に答える 2

13

InputStream をPushbackInputStreamにラップできます。このクラスは、最初の数バイトをread()内部バッファーに格納します。後でunread()バイトを取得して、オブジェクトをサードパーティのライブラリに渡すことができます。

ByteArrayInputStream は、ストリームからのすべてのデータをメモリに保持するため、あまり好きではありません。

また、いずれにせよ、空のストリームをチェックするために read() を強制されます。つまり、少なくとも数バイトの間、ネットワークにヒットすることになります。

于 2011-03-30T22:55:58.640 に答える
5

いくつかの代替手段:

  • ByteArrayInputStreamsまた、他のいくつかの同様のクラスは、データが既に VM メモリにあるため、定義上非ブロッキングです。そのような場合、available()fromInputStreamが必要なものになる可能性があります。これは、ネットワーク ソケット、標準入力、またはファイルなど、プログラムの外部の入力ソースから読み取る場合には機能しません

  • markSupported()メソッドが特定のインスタンスに対して true を返す場合、およびメソッドをInputStream使用して、ストリームで使用しようとした後にストリームの先頭に戻ることができる場合があります。mark()reset()read()

編集:

ところで、ByteArrayInputStreamsサポートmark()reset()非常にうまく、それらはデフォルトで position でマークされています0。このコード:

InputStream x = new ByteArrayInputStream(new String("1234567890").getBytes());

byte b[] = new byte[1];

x.read(b, 0 , 1);
System.out.println(b[0]);

x.read(b, 0 , 1);
System.out.println(b[0]);

x.reset();

x.read(b, 0 , 1);
System.out.println(b[0]);

この出力があります:

49
50
49
于 2011-03-30T22:30:40.290 に答える