在Java中测试空的InputStream

lis*_*sak 7 java inputstream java-io

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

问题是,有时人们无法测试read()是否返回-1,因为如果你有一个流而某些第三方库使用它,你需要在发送它之前测试它是否为空.

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

Leo*_*nel 13

您可以将InputStream包装在PushbackInputStream中.该类将存储read()内部缓冲区中的前几个字节.您可以稍后unread()使用字节并将对象传递给第三方库.

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

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


thk*_*ala 5

几个选择:

  • ByteArrayInputStreams根据定义,其他几个类似的类是非阻塞的,因为数据已经存在于VM内存中.在这些情况下,available()来自InputStream你可能是你需要的.这会不会从外部程序的输入源读取时的工作,例如,网络插座,标准输入或者甚至一个文件.

  • 如果该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]);
Run Code Online (Sandbox Code Playgroud)

有这个输出:

49
50
49
Run Code Online (Sandbox Code Playgroud)