1 回答

TA貢獻1804條經驗 獲得超3個贊
您復制的代碼不正確。它假設(錯誤地)每次調用read都會返回buffer.lengthbytes 或 return -1。
您應該做的是捕獲每次在變量中讀取的字節數,然后準確寫入該字節數。您用于關閉流的代碼很冗長并且(理論上1)也有錯誤。
這是解決這兩個問題以及其他一些問題的重寫。
void copyBufferedFile(BufferedInputStream bufferedInputStream,
? ? ? ? ? ? ? ? ? ? ? BufferedOutputStream bufferedOutputStream)
? ? ? ? ?throws IOException?
{
? ? try (BufferedInputStream in = bufferedInputStream;
? ? ? ? ?BufferedOutputStream out = bufferedOutputStream)?
? ? {
? ? ? ? byte[] buf = new byte[1024];
? ? ? ? int nosRead;
? ? ? ? while ((nosRead = in.read(buf)) != -1)? // read this carefully ...
? ? ? ? {
? ? ? ? ? ? out.write(buf, 0, nosRead);
? ? ? ? }
? ? }
}
正如您所看到的,我已經擺脫了虛假的“捕獲和擠壓異常”處理程序,并使用 Java 7+?try with resources修復了資源泄漏。
仍然存在幾個問題:
復制函數最好將文件名字符串(或
File
對象Path
)作為參數并負責打開流。鑒于您正在執行塊讀取和寫入,因此使用緩沖流沒有什么價值。(事實上,它可能會使 I/O 變慢。)最好使用普通流并使緩沖區的大小與類使用的默認緩沖區大小相同或
Buffered*
更大。
1 - 理論上,如果拋出bufferedInputStream.close()
異常,bufferedOutputStream.close()
調用將被跳過。實際上,關閉輸入流不太可能引發異常。但無論哪種方式,嘗試資源方法都會正確且更加簡潔地處理這個問題。
添加回答
舉報