2011-01-06 100 views
1

我寫了一個Java程序,爲我下載音頻文件,並使用BufferedInputStream。 read()函數工作正常,但速度很慢,所以我嘗試使用byte []的重載版本。BufferedInputStream.read(byte [])導致問題。任何人有過這個問題嗎?

由於某些原因,下載後音頻變得有損和奇怪。我不完全確定我做錯了什麼,所以任何幫助表示讚賞!這是代碼的簡化版本。

BufferedInputStream bin = new BufferedInputStream((new URL(url)).openConnection().getInputStream()); 
File file = new File(fileName); 
FileOutputStream fop = new FileOutputStream(file); 
int rd = bin.read(); 
while(rd != -1) 
{ 
    fop.write(rd); 
    rd = bin.read(); 
} 

回答

6

請記住,當您以字節讀取時,read將返回實際接收的字節數。您需要傳遞該計數來寫入,因爲您的字節數組中可能包含無關數據。在最後一塊數據中尤其如此。

+0

哦,我的...這是一個粗心的錯誤!非常感謝您指出我! :D – 2011-01-06 00:58:25

+0

它發生在我們身上!我不止一次地發生過這種情況......通常會使用圖像文件,因此在複製的圖像中會出現奇怪的工件。最大的症狀是,我的所有文件大小都是1024的倍數。這就是死亡給出的。 – Zeki 2011-01-06 01:06:56

1

您正在使用的讀取方法實際上會返回其返回的int內的一個字節,這意味着變量「rd」中只有32位的8位被實際使用。

該方法寫入指出它將int作爲參數,但將「指定的字節寫入此文件輸出流」。這意味着你應該沒問題..但我想你不是D:

嘗試使用讀取方法,它將字節數組作爲參數,然後將該字節數組寫入輸出流。

但是,請注意,這種其他讀取方法,即將一個字節數組作爲參數的方法,它也會返回一個int值。但與您在示例中使用的方法(它從輸入數據返回其中一個字節)不同,此另一個讀取方法返回讀取的字節數。這不是你的字節數組可以包含的字節數。在這種情況下,您必須確保您不會向輸出流中寫入的字節數多於實際從最後一次讀取操作中讀取的字節數量。

相關問題