[英]How to re-read an InputStream after calling IOUtils.copy?
我只是用
IOUtils.copy(myInputStream, myOutputStream);
而且我看到,在調用IOUtils.copy之前,輸入流可供讀取,之后則無法讀取。
flux.available()
(int) 1368181 (before)
(int) 0 (after)
我在這篇文章中看到了一些解釋,並且看到可以將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));
效果大致相同,但查看您要執行的操作稍微容易一些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.