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

Cle*_*mzd 1 java inputstream

我只是用

IOUtils.copy(myInputStream, myOutputStream);
Run Code Online (Sandbox Code Playgroud)

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

flux.available()
     (int) 1368181 (before)
     (int) 0 (after)
Run Code Online (Sandbox Code Playgroud)

我看到了这方面的一些解释,我看我可以复制 bytes从我InputStreamByteArrayInputStream,然后用mark(0)read(),以多次读取的输入流.

这是得到的代码(正在运行).我发现这段代码非常冗长,如果有更好的解决方案,我想要这样做.

ByteArrayInputStream fluxResetable = new ByteArrayInputStream(IOUtils.toByteArray(myInputStream));
fluxResetable.mark(0);
IOUtils.copy(fluxResetable, myOutputStream);
fluxResetable.reset();
Run Code Online (Sandbox Code Playgroud)

biz*_*lop 7

InputStream,除非另有说明,是单发射击:你一次消费它,就是这样.

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

byte [] content = IOUtils.toByteArray(myInputStream);
IOUtils.copy(new ByteArrayInputStream(content), myOutputStream);
doSomethingElse(new ByteArrayInputStream(content));
Run Code Online (Sandbox Code Playgroud)

效果或多或少相同,但更容易看到你想要做的事情.