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

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

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

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

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

除了将原始InputStream写入内存(y牛!)或临时文件之外,如果我需要再次从顶部读取流,我除了找到新的InputStream到那些临时位置之外,没有其他方法可以做到这一点.

解决方法:

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

上一篇:在Java 1.4 InputStream上替换char


下一篇:java-IOUtils.copy和IOUtils.copyLarge非常慢