2010-08-24 53 views
5

Hiho,通過字節複製一個流[]

我必須複製一個輸入流。在網上搜索了一下後,我在bytearray的幫助下試了一下。我的代碼看起來像這樣(「是」是的InputStream):

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    while (is.read() != -1) { 
     bos.write(is.read()); 
    } 
    byte[] ba = bos.toByteArray(); 

    InputStream test = new ByteArrayInputStream(ba); 
    InputStream test2 = new ByteArrayInputStream(ba); 

和它的作品..幾乎

在這兩個流時,PROGRAMM只複製第二個字符 因此,「DOR A =」 104「/>」在「is」流中變成: 「O = 14 /」 其他流

問題是什麼?我無法理解發生了什麼事。

希望有人能給我一個解決方案:)

問候

回答

6

你必須讀取字節的while循環的變量分配。在你當前的代碼中,你只需要丟棄它。以下是正確的:

int b; 
while((b = read()) != -1) { 
    bos.write(b); 
} 

當然讀取單個字節不是很有效。你應該考慮在你的下一個版本中使用字節數組。

+1

非常感謝!我明白是什麼問題:) (因爲我用了兩次讀取方法跳轉兩次) – Graslandpinguin 2010-08-24 08:15:45

+0

這是不正確的。它不會編譯。你不能在while條件中聲明一個變量。 – EJP 2012-10-03 23:37:40

+0

@EJP:那你爲什麼要回滾你的修正(而且可能選擇downvote)? – musiKk 2012-10-04 07:42:32

16

那是因爲你在你的循環忽略所有的奇怪的字符,除非他們是-1,通過調用read()的兩倍。下面是使用一個緩衝的正確方法(你可以調整緩存大小):

int count; 
byte[] buffer = new byte[8192]; 
while ((count = in.read(buffer)) > 0) 
    out.write(buffer, 0, count);