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

Posted

技术标签:

【中文标题】我可以关闭/重新打开 InputStream 以模拟不支持标记的输入流的标记/重置吗?【英文标题】:Can I close/reopen InputStream to mimic mark/reset for input streams that do not support mark? 【发布时间】:2011-08-04 08:09:46 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

你说得对,InputStream's 不是小事。然而,我意识到我实际上是在处理 ImageInputStream 具有用于标记/重置的到达器 API。

以上是关于我可以关闭/重新打开 InputStream 以模拟不支持标记的输入流的标记/重置吗?的主要内容,如果未能解决你的问题,请参考以下文章

可以'重新打开由 jQuery 关闭的下拉菜单

InputStream 不会关闭,或者需要永远

Firebase - 重新打开应用程序后用户注销时应用程序关闭

调用 IOUtils.copy 后如何重新读取 InputStream?

保存当前 ImageView 状态以关闭和重新打开应用程序

关闭并重新打开后继续填写 HTML 表单