我有以下语句:
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());
}