2010-10-31 34 views
6

我想知道如何製作InputStream的深層副本。如何在Java中製作InputStream的深層副本

我知道它可以使用IOUtils包來完成,但我想盡可能避免使用它們。 有誰知道另一種方式?

+0

public static int copy(InputStream input, OutputStream output) throws IOException{ byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; int count = 0; int n = 0; while (-1 != (n = input.read(buffer))) { output.write(buffer, 0, n); count += n; } return count; } 

瞭解更多? Afaik你不能從一個流中讀兩次。 – thejh 2010-10-31 17:39:15

+0

由於某些奇怪的原因,我認爲一旦使用了它,我的信息流就會被消耗。所以爲了讓sur不是這種情況,我想做一個深層次的複製。我正在使用android,並使用REST架構從web服務獲取圖像。 – Spredzy 2010-10-31 17:42:53

+4

爲什麼不告訴我們相關的代碼並解釋你遇到的實際問題? – 2010-10-31 18:01:31

回答

16

InputStream是抽象的,不會公開內部數據對象(它們的子對象)。因此,「深度複製」InputStream的唯一方法是創建ByteArrayOutputStream,並在對InputStream執行read()之後,將此數據寫入(ByteArrayOutputStream)。然後做:

newStream = new ByteArrayInputStream(byteArrayOutputStream.toArray()); 

如果你在你的InputStream使用mark()那麼你的確無法逆轉這種趨勢。這使您的流「消耗」。

爲了「重用」您的InputStream避免使用mark(),然後在讀取結束時調用reset()。您將從流的開頭讀取。

編輯:

BTW,IOUtils使用這個簡單的代碼片段複製的InputStream:你爲什麼要那麼做http://kickjava.com/src/org/apache/commons/io/CopyUtils.java.htm#ixzz13ymaCX9m

+0

你通常使用什麼DEFAULT_BUFFER_SIZE這個方法? – 2014-12-16 14:39:10