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

时间:2011-09-19 18:32:16

标签: java io inputstream datainputstream

我有以下声明:

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

我想打印此输入流的内容,但我不知道此流的大小。我该如何阅读此流并打印出来?

4 个答案:

答案 0 :(得分:8)

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

但我认为,您已将InputStream标记为DataInputStream,原因很简单:要解析二进制数据。 (注意:Scanner仅用于文本数据。)

DataInputStream的{​​{3}}向您显示,此类有两种不同的方式来指示EOF - 每种方法都返回-1或抛出EOFException。经验法则是:

  • InputStream继承的每个方法都使用“return -1”惯例,
  • InputStream继承的每个 NOT 方法都会引发EOFException

例如,如果使用readShort,请在读取异常之前进行读取,如果使用“read()”,请在返回-1之前执行此操作。

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

答案 1 :(得分: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`
}

答案 2 :(得分: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

答案 3 :(得分:-1)

DataInputStream已经过时了。我建议你改用Scanner

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