Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中空InputStream的测试_Java_Inputstream_Java Io - Fatal编程技术网

Java中空InputStream的测试

Java中空InputStream的测试,java,inputstream,java-io,Java,Inputstream,Java Io,你们如何测试一个空的输入流?我知道InputStream是为与远程资源一起工作而设计的,所以在您实际读取它之前,您无法知道它是否在那里。我不能使用read(),因为当前位置将发生变化,使用mark()并重置它似乎不合适 问题是,有时无法测试read()是否返回-1,因为如果您有一个流,并且某个第三方库使用它,则需要在将它发送到那里之前测试它是否为空 空输入流是指这些新的ByteArrayInputStream(新的字节[0])两个备选方案: ByteArrayInputStreams和其他几个

你们如何测试一个空的输入流?我知道InputStream是为与远程资源一起工作而设计的,所以在您实际读取它之前,您无法知道它是否在那里。我不能使用read(),因为当前位置将发生变化,使用mark()并重置它似乎不合适

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


空输入流是指这些
新的ByteArrayInputStream(新的字节[0])

两个备选方案:

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

  • 如果
    markSupported()
    方法对于特定的
    InputStream
    实例返回true,则在尝试对其使用
    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,因为它将流中的所有数据都保存在内存中

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