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

How to re-read an InputStream after calling IOUtils.copy?

我只是用

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();

一个InputStream,除非另有说明,是单发的:你吃一次就完了。

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

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

效果大致相同,但更容易看出您要做什么。