0

简而言之,我需要用一个流做两件事。

  1. 我需要通过一个方法传递一个流,以查看该流的字节是否属于特定类型。

  2. 检查完成后,我需要使用该流创建一个新类。

我对流很陌生,我知道它们是“单向街道”。因此,如果我发现自己需要重用流,我认为我的代码设计不好。

这是逻辑的片段:

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;
}
4

2 回答 2

1

通常,您无法重置 InputStream 以恢复开始。但是,有 mark() / reset() 方法可以让流记住当前位置,并且您可以使用 reset() 将流倒回到标记的位置。

问题是,它们是可选的,并且可能不受正在使用的特定流类的支持。BufferedInputStream 确实支持 mark() / reset() (尽管在缓冲区限制内)。您可以将 InputStream 包装在 BufferedInputStream 中,立即 mark() 然后运行检测代码(但确保它不会提前读取超过缓冲区大小,您可以在 BufferedInputStream 构造函数中指定缓冲区大小)。然后调用 reset() 并真正读取流。

编辑:如果您仍然使用 ByteArrayInputStream,那么它支持在其整个长度上进行标记/重置(自然)。

于 2013-07-26T14:20:27.530 回答
1

这完全取决于InputStream实现是否支持mark(). 请参阅http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#markSupported()。调用reset()不支持的流mark()可能会引发异常。

BufferedInputStreamByteArrayInputStream支持mark(),但其他人没有。

于 2013-07-26T14:20:56.323 回答