6

私は次の声明を持っています:

DataInputStream is = new DataInputStream(process.getInputStream());

この入力ストリームの内容を出力したいのですが、このストリームのサイズがわかりません。このストリームをどのように読み取って印刷すればよいですか?

4

4 に答える 4

8

長さが事前にわからないことは、すべてのストリームに共通です。標準を使用する通常の解決策は、返されるまでInputStream単純に呼び出すことです。read-1

しかし、正当な理由で標準InputStreamを でラップしたと思います。バイナリデータを解析するためです。(注:はテキスト データのみを対象としています。)DataInputStreamScanner

JavaDoc forは、このクラスには EOF を示す 2 つの異なる方法があることを示しています。DataInputStream各メソッド-1EOFException. 経験則は次のとおりです。

  • から継承されるすべてのメソッドInputStreamは、"return -1" 規則を使用します。
  • から継承されていないすべてのメソッドInputStreamは、EOFException.

たとえば、使用する場合readShortは例外がスローされるまで読み取り、「read()」を使用する場合-1は返されるまでそうします。

ヒント:最初は十分注意して、使用する各メソッドを調べてくださいDataInputStream。経験則が破られる可能性があります。

于 2011-09-19T19:42:19.430 に答える
2

事前に割り当てられたバッファを渡して、繰り返し呼び出しis.read(byte[])ます(同じバッファを再利用し続けることができます)。この関数は、実際に読み取られたバイト数、またはストリームの最後で-1を返します(この場合、停止します)。

byte[] buf = new byte[8192];
int nread;
while ((nread = is.read(buf)) >= 0) {
  // process the first `nread` bytes of `buf`
}
于 2011-09-19T18:34:20.770 に答える
1
byte[] buffer = new byte[100];
int numberRead = 0;
do{
   numberRead = is.read(buffer);
   if (numberRead != -1){
      // do work here
   }
}while (numberRead == buffer.length);

ループ内で設定されたバッファサイズを読み取り続けます。戻り値がバッファのサイズよりも小さい場合は、ストリームの最後に到達したことがわかります。戻り値が-1の場合、バッファにデータはありません。

DataInputStream.read

于 2011-09-19T18:35:49.223 に答える
-1

DataInputStream時代遅れのものです。代わりに使用することをお勧めしますScanner

Scanner sc = new Scanner (process.getInputStream());
while (sc.hasNextXxx()) {
   System.out.println(sc.nextXxx());
}
于 2011-09-19T18:36:44.213 に答える