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

时间:2015-08-05 09:25:02

标签: java inputstream

我只是使用

IOUtils.copy(myInputStream, myOutputStream);

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

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

我在post上看到了一些解释,我看到我可以将bytesInputStream复制到ByteArrayInputStream,然后使用mark(0)read(),以便多次读取输入流。

这是产生的代码(正在运行)。 我发现这段代码非常详细,如果有更好的解决方案,我想要这样做。

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

1 个答案:

答案 0 :(得分:7)

InputStream,除非另有说明,否则为单次拍摄:您只需使用一次即可。

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

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

效果或多或少相同,但您可以更轻松地看到您尝试做的事情。