Java中空InputStream的测试
你们如何测试一个空的输入流?我知道InputStream是为与远程资源一起工作而设计的,所以在您实际读取它之前,您无法知道它是否在那里。我不能使用read(),因为当前位置将发生变化,使用mark()并重置它似乎不合适 问题是,有时无法测试read()是否返回-1,因为如果您有一个流,并且某个第三方库使用它,则需要在将它发送到那里之前测试它是否为空Java中空InputStream的测试,java,inputstream,java-io,Java,Inputstream,Java Io,你们如何测试一个空的输入流?我知道InputStream是为与远程资源一起工作而设计的,所以在您实际读取它之前,您无法知道它是否在那里。我不能使用read(),因为当前位置将发生变化,使用mark()并重置它似乎不合适 问题是,有时无法测试read()是否返回-1,因为如果您有一个流,并且某个第三方库使用它,则需要在将它发送到那里之前测试它是否为空 空输入流是指这些新的ByteArrayInputStream(新的字节[0])两个备选方案: ByteArrayInputStreams和其他几个
空输入流是指这些
新的ByteArrayInputStream(新的字节[0])
两个备选方案:
和其他几个类似的类根据定义是非阻塞的,因为数据已经在VM内存中。在这些情况下,ByteArrayInputStreams
中的InputStream
available()。当从程序外部的输入源(例如网络套接字、标准输入或文件)读取时,这将不起作用
- 如果
方法对于特定的markSupported()
实例返回true,则在尝试对其使用InputStream
后,您可以使用read()
和mark()
方法返回到流的开头reset()
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
您可以将输入流包装在一个文件中。此类将把
read()
中的前几个字节存储在内部缓冲区中。您可以稍后unread()
读取字节并将对象传递给第三方库
我真的不喜欢ByteArrayInputStream,因为它将流中的所有数据都保存在内存中
此外,在任何情况下,您都将被迫读取()以检查空流,这意味着您将访问网络,至少几个字节