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

Java 调用IOUtils.copy后如何重新读取InputStream?,java,inputstream,Java,Inputstream,我只是用 IOUtils.copy(myInputStream, myOutputStream); 我发现在调用IOUtils.copy之前,输入流可以读取,而在调用IOUtils.copy之后,输入流不能读取 flux.available() (int) 1368181 (before) (int) 0 (after) 我看到了一些关于这方面的解释,我看到我可以将字节从InputStream复制到ByteArrayInputStream,然后使用mark0和read,以

我只是用

IOUtils.copy(myInputStream, myOutputStream);
我发现在调用IOUtils.copy之前,输入流可以读取,而在调用IOUtils.copy之后,输入流不能读取

flux.available()
     (int) 1368181 (before)
     (int) 0 (after)
我看到了一些关于这方面的解释,我看到我可以将字节从InputStream复制到ByteArrayInputStream,然后使用mark0和read,以便多次读取输入流

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

ByteArrayInputStream fluxResetable = new ByteArrayInputStream(IOUtils.toByteArray(myInputStream));
fluxResetable.mark(0);
IOUtils.copy(fluxResetable, myOutputStream);
fluxResetable.reset();
一个输入流,除非另有说明,是单次的:你消费它一次,就这样了

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

byte [] content = IOUtils.toByteArray(myInputStream);
IOUtils.copy(new ByteArrayInputStream(content), myOutputStream);
doSomethingElse(new ByteArrayInputStream(content));
效果大致相同,但更容易看出您正在尝试执行的操作。

除非另有说明,否则输入流是一次性的:您消费一次,就这样

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

byte [] content = IOUtils.toByteArray(myInputStream);
IOUtils.copy(new ByteArrayInputStream(content), myOutputStream);
doSomethingElse(new ByteArrayInputStream(content));
效果大致相同,但更容易看出您正在尝试做什么