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

Posted

技术标签:

【中文标题】调用 IOUtils.copy 后如何重新读取 InputStream?【英文标题】:How to re-read an InputStream after calling IOUtils.copy? 【发布时间】:2015-10-27 23:44:27 【问题描述】:

我只是使用

IOUtils.copy(myInputStream, myOutputStream);

而且我看到在调用 IOUtils.copy 之前输入流可以读取,之后不可以读取。

flux.available()
     (int) 1368181 (before)
     (int) 0 (after)

我看到了对此post 的一些解释,我看到我可以将bytes 从我的InputStream 复制到ByteArrayInputStream,然后使用mark(0)read(),以便多次阅读输入流。

这是生成的代码(正在运行)。 我发现这段代码非常冗长,我想知道是否有更好的解决方案。

ByteArrayInputStream fluxResetable = new ByteArrayInputStream(IOUtils.toByteArray(myInputStream));
fluxResetable.mark(0);
IOUtils.copy(fluxResetable, myOutputStream);
fluxResetable.reset();

【问题讨论】:

【参考方案1】:

除非另有说明,否则InputStream 是单发的:您使用一次即可。

如果您想多次阅读它,那不再只是一个流,而是一个带有缓冲区的流。您的解决方案准确地反映了这一点,因此可以接受。我可能会改变的一件事是存储字节数组并在需要时始终从它创建一个新的ByteArrayInputStream,而不是重置同一个:

byte [] content = IOUtils.toByteArray(myInputStream);
IOUtils.copy(new ByteArrayInputStream(content), myOutputStream);
doSomethingElse(new ByteArrayInputStream(content));

效果或多或少相同,但更容易看出你想要做什么。

【讨论】:

以上是关于调用 IOUtils.copy 后如何重新读取 InputStream?的主要内容,如果未能解决你的问题,请参考以下文章

InputStream的read方法

记一次poi版本升级产生的错误

关闭后如何重新打开 php 会话?

调用 .disconnect() 后如何重新连接

在 chrome 控制台中重新加载后如何保持循环?

如何在javascript中单击按钮重新加载网页,但在重新加载调用函数后