3

我试图java.io.InputStream从流的顶部开始多次阅读。

显然,对于返回的流,truemarkSupported()可以尝试使用mark(availableBytes),然后reset()从顶部再次读取流。

大多数流不支持标记,而那些支持(例如java.io.BufferedInputStream)将数据复制到临时字节数组中,这在内存消耗等方面并不好。

如果我的方法java.io.InputStream作为参数接收,我可以关闭它然后以某种方式重新打开它以将相同的原始流重置到顶部,以便我可以再次读取它?

InputStream除了将原始文件写入内存(牦牛!)或临时文件之外InputStream,如果我需要再次从顶部读取流,我找不到任何方法来执行此技巧。

4

1 回答 1

3

您可以关闭它,但是在不创建数据的显式副本的情况下重新打开相同数据流到相同数据的唯一方法是确定InputStream您正在处理的具体类型(简单),该流被初始化指向什么(根据流类型及其接口可能很容易、很难或不可能),然后添加代码以使用原始源输入实例化具体流类型的新实例(不难,但也不是很容易维护和容易破坏如果有人创建了InputStream您不知道如何处理的自定义实现)。

于 2011-04-13T01:16:31.603 回答