我有以下声明:
DataInputStream is = new DataInputStream(process.getInputStream());
我想打印这个输入流的内容,但我不知道这个流的大小。我应该如何阅读这个流并打印它?
我有以下声明:
DataInputStream is = new DataInputStream(process.getInputStream());
我想打印这个输入流的内容,但我不知道这个流的大小。我应该如何阅读这个流并打印它?
所有 Streams 的共同点是预先不知道长度。使用标准InputStream
,通常的解决方案是简单地调用read
直到-1
返回。
但我认为,你已经用一个很好的理由包装了一个标准InputStream
:DataInputStream
解析二进制数据。(注:Scanner
仅用于文本数据。)
JavaDoc向DataInputStream
您展示,这个类有两种不同的方式来指示 EOF - 每个方法都返回或-1
抛出一个EOFException
. 一个经验法则是:
InputStream
使用“return -1
”约定,InputStream
抛出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
是过时的东西。我建议你Scanner
改用。
Scanner sc = new Scanner (process.getInputStream());
while (sc.hasNextXxx()) {
System.out.println(sc.nextXxx());
}