2011-03-30 66 views
6

你们如何测试一个空的InputStream?我知道InputStream旨在与远程资源一起工作,因此直到您真正阅读它时才能知道它是否在那里。我不能使用read(),因为当前位置会改变,使用mark()并重置它似乎是不合适的。在Java中测试空InputStream

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

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

回答

12

你可以用你的InputStream在PushbackInputStream。这个类将把read()的前几个字节存储在一个内部缓冲区中。您可以稍后unread()字节并将对象传递给第三方库。

我不太喜欢ByteArrayInputStream,因为它在内存中保存来自流中的数据的全部

另外,在任何情况下,您都将被强制读取()以检查空流,这意味着您将会访问网络,至少需要几个字节。

0

请问方法available()对你InputStream工作?

+0

这看起来像约翰(下面)要做的正确版本,虽然稍有不同,因为它返回的是一个int,但是原理相同。不过,我会请它重写一下,因为你在这里写的方式使'available()'看起来像一个静态方法,事实并非如此。如果它是一个静态方法,那么除非它需要一个输入,否则它将毫无用处,但它不是静态的。 – gnomed 2011-03-30 22:24:48

+0

伙计们,我期待更多一点...首先,你真的认为我不知道inputStream接口中少数几个方法之一吗?其次,IS实现不同地实现这种方法,他们说你不应该依赖它... – lisak 2011-03-30 22:27:07

+0

@Edgar看起来你基本上有三种选择。 1)Trust可用(),它的实现稍有不同,但对于Java API之后的任何事情基本上都是你想要的2)将它加载到Reader中并检查它是否准备就绪()3)mark()和reset() 。 – 2011-03-30 22:32:18

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]); 

有这样的输出:

49 
50 
49