我可以关闭/重新打开InputStream来模拟不支持mark的输入流的标记/重置吗?

时间:2011-04-13 01:03:15

标签: java io inputstream java-io bufferedinputstream

我正在尝试从流的顶部开始多次阅读java.io.InputStream

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

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

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

除了将原始InputStream写入内存(牦牛!)或临时文件而不是将新InputStream打开到那些临时位置(如果我需要阅读)时,我找不到任何方法来做这个技巧再次从顶部流出。

1 个答案:

答案 0 :(得分:3)

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