7

你们如何测试一个空的InputStream?我知道 InputStream 设计用于处理远程资源,因此在实际读取它之前你无法知道它是否存在。我不能使用 read() 因为当前位置会改变并且使用 mark() 并为此重置似乎是不合适的。

问题是,有时无法测试 read() 是否返回 -1,因为如果您有一个流并且某些第三方库使用它,则需要在将其发送到那里之前测试它是否为空。

通过空 InputStreams 我的意思是这些new ByteArrayInputStream(new byte[0])

4

2 回答 2

13

您可以将 InputStream 包装在PushbackInputStream中。此类将存储来自read()内部缓冲区的前几个字节。您可以稍后unread()将字节传递给第 3 方库。

我不太喜欢 ByteArrayInputStream,因为它将流中的所有数据保存在内存中。

此外,在任何情况下,您都将被迫 read() 来检查空流,这意味着您将访问网络,至少几个字节。

于 2011-03-30T22:55:58.640 回答
5

几个选择:

  • ByteArrayInputStreams和其他几个类似的类根据定义是非阻塞的,因为数据已经在 VM 内存中。在这些情况下,available()fromInputStream可能是您需要的。当从程序外部的输入源(例如网络套接字、标准输入或什至文件)读取时,这将不起作用。

  • 如果该markSupported()方法针对特定InputStream实例返回 true,则您可以在尝试对其使用后使用mark()reset()方法返回到流的开头read()

编辑:

顺便说一句,ByteArrayInputStreams支持mark()reset()非常好,它们默认标记在位置0。这段代码:

InputStream x = new ByteArrayInputStream(new String("1234567890").getBytes());

byte b[] = new byte[1];

x.read(b, 0 , 1);
System.out.println(b[0]);

x.read(b, 0 , 1);
System.out.println(b[0]);

x.reset();

x.read(b, 0 , 1);
System.out.println(b[0]);

有这个输出:

49
50
49
于 2011-03-30T22:30:40.290 回答