java中从DataInputStream中读取的缓冲区大小未知



我有以下语句:

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

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

对于所有流来说,长度都是事先不知道的。使用标准的InputStream,通常的解决方案是简单地调用read,直到返回-1

但是我假设,您已经用DataInputStream包装了标准InputStream是有原因的:解析二进制数据。(注:Scanner仅用于文本数据)

DataInputStream的JavaDoc告诉您,这个类有两种不同的方式来指示EOF——每个方法要么返回-1,要么抛出EOFException。经验法则是:

  • 每个从InputStream继承的方法都使用"return -1 "约定,
  • InputStream继承的方法NOT抛出EOFException

例如,如果你使用readShort,读取直到抛出异常,如果你使用"read()",读取直到返回-1

提示:非常开始时要小心,并从DataInputStream中查找您使用的每个方法-经验法则可能会被打破。

反复调用is.read(byte[]),传递一个预分配的缓冲区(您可以继续重用相同的缓冲区)。该函数将返回实际读取的字节数,或者在流结束时返回-1(在这种情况下,停止):

byte[] buf = new byte[8192];
int nread;
while ((nread = is.read(buf)) >= 0) {
  // process the first `nread` bytes of `buf`
}
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

DataInputStream是过时的东西。我建议您使用Scanner

Scanner sc = new Scanner (process.getInputStream());
while (sc.hasNextXxx()) {
   System.out.println(sc.nextXxx());
}

最新更新