1 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
您復(fù)制的代碼不正確。它假設(shè)(錯(cuò)誤地)每次調(diào)用read都會(huì)返回buffer.lengthbytes 或 return -1。
您應(yīng)該做的是捕獲每次在變量中讀取的字節(jié)數(shù),然后準(zhǔn)確寫(xiě)入該字節(jié)數(shù)。您用于關(guān)閉流的代碼很冗長(zhǎng)并且(理論上1)也有錯(cuò)誤。
這是解決這兩個(gè)問(wèn)題以及其他一些問(wèn)題的重寫(xiě)。
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);
? ? ? ? }
? ? }
}
正如您所看到的,我已經(jīng)擺脫了虛假的“捕獲和擠壓異常”處理程序,并使用 Java 7+?try with resources修復(fù)了資源泄漏。
仍然存在幾個(gè)問(wèn)題:
復(fù)制函數(shù)最好將文件名字符串(或
File
對(duì)象Path
)作為參數(shù)并負(fù)責(zé)打開(kāi)流。鑒于您正在執(zhí)行塊讀取和寫(xiě)入,因此使用緩沖流沒(méi)有什么價(jià)值。(事實(shí)上,它可能會(huì)使 I/O 變慢。)最好使用普通流并使緩沖區(qū)的大小與類使用的默認(rèn)緩沖區(qū)大小相同或
Buffered*
更大。
1 - 理論上,如果拋出bufferedInputStream.close()
異常,bufferedOutputStream.close()
調(diào)用將被跳過(guò)。實(shí)際上,關(guān)閉輸入流不太可能引發(fā)異常。但無(wú)論哪種方式,嘗試資源方法都會(huì)正確且更加簡(jiǎn)潔地處理這個(gè)問(wèn)題。
添加回答
舉報(bào)