簡體   English   中英

調用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)

我在這篇文章中看到了一些解釋,並且看到可以將bytesInputStream復制到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));

效果大致相同,但查看您要執行的操作稍微容易一些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM