6

我有以下声明:

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

我想打印这个输入流的内容,但我不知道这个流的大小。我应该如何阅读这个流并打印它?

4

4 回答 4

8

所有 Streams 的共同点是预先不知道长度。使用标准InputStream,通常的解决方案是简单地调用read直到-1返回。

但我认为,你已经用一个很好的理由包装了一个标准InputStreamDataInputStream解析二进制数据。(注:Scanner仅用于文本数据。)

JavaDocDataInputStream您展示,这个类有两种不同的方式来指示 EOF - 每个方法都返回或-1抛出一个EOFException. 一个经验法则是:

  • 继承自的每个方法都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 回答