我正在尝试从流的顶部开始多次阅读java.io.InputStream
。
显然,对于返回true
到markSupported()
的流,我可以尝试使用mark(availableBytes)
然后reset()
从顶部再次读取流。
大多数流不支持mark,而那些(例如java.io.BufferedInputStream
)将数据复制到临时字节数组中,这在内存消耗方面并不好等。
如果我的方法收到java.io.InputStream
作为参数我可以关闭它然后以某种方式重新打开它以将相同的原始流重置为顶部以便我可以再次阅读它吗?
除了将原始InputStream
写入内存(牦牛!)或临时文件而不是将新InputStream
打开到那些临时位置(如果我需要阅读)时,我找不到任何方法来做这个技巧再次从顶部流出。
答案 0 :(得分:3)
您可以关闭它,但是将相同的流重新打开到同一数据而不在某处创建数据的显式副本的唯一方法是确定您正在处理的InputStream
具体类型(简单),该流被初始化为什么(根据流类型及其接口可能很容易,很难或不可能),然后添加代码以使用原始源输入实例化具体流类型的新实例(不难,但如果有人创建了一个你不知道如何处理的自定义InputStream
实现,那么也不会很容易维护和轻松破解。