Java 是否可以多次使用流?
简而言之,我需要用一个流做两件事Java 是否可以多次使用流?,java,inputstream,Java,Inputstream,简而言之,我需要用一个流做两件事 我需要通过一个方法传递一个流,以查看该流的字节是否属于特定类型 检查完成后,我需要使用该流创建一个新类 我对流非常陌生,我知道它们是“单向的街道”,所以如果我发现自己需要重用流,我认为我的代码中有一个糟糕的设计 这里是一个逻辑的小片段: byte[] header = new byte[1024]; //reads entire array or until EOF whichever is first bis.mark(header.length); bis.
byte[] header = new byte[1024];
//reads entire array or until EOF whichever is first
bis.mark(header.length);
bis.read(header);
if(isFileType(header)) {
bis.reset();
_data.put(fileName, new MyClass(bis)); // Stream is now closed...
methodForFinalBytes(bis);
} else {
// Do other stuff;
}
通常,您无法重置InputStream以返回开始。但是,有一些mark()/reset()方法可以使流记住当前位置,并且可以使用reset()将流倒回到标记的位置 问题是,它们是可选的,并且可能不受正在使用的特定流类的支持。BufferedInputStream不支持mark()/reset()(尽管在缓冲区限制内)。您可以将InputStream包装在BufferedInputStream中,立即标记(),然后运行检测代码(但请确保它不会提前读取超过缓冲区大小的内容,您可以在BufferedInputStream构造函数中指定缓冲区大小)。然后调用reset()并真正读取流
编辑:如果仍然使用ByteArrayInputStream,则整个长度上都支持标记/重置(自然)。这完全取决于
InputStream
实现是否支持mark()
。看见在不支持mark()
的流上调用reset()
可能会引发异常
BufferedInputStream
和ByteArrayInputStream
支持mark()
,但其他人不支持