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()检查空流,这意味着您将打网络,至少几个字节.
几个选择:
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)
| 归档时间: |
|
| 查看次数: |
16531 次 |
| 最近记录: |