Java 檔案複製(更改緩衝區大小)
在 Java 中 java.io.InputStream、java.io.OutputStream 在
本節介紹一個使用輸入/輸出流執行複製操作的範例程式。
在基於流的複製中,增加讀取緩衝區大小可以實現相對較快的複製速度,即使是複製大檔案也是如此。
範例程式可讓您將資料讀取緩衝區大小指定為參數。
指定的讀取緩衝區區域分配在 Java 虛擬機器堆中,因此設定過大會降低效率。所以,在複製檔案時,我們也會檢查最佳資料讀取緩衝區大小。
範例程式
/**
資料從輸入流寫入輸出流。
* 複製過程完成後,輸入和輸出流將會關閉。
* 輸入流中的 @param
* @param os 輸出流
* @param bufferSize 讀取資料的緩衝區大小(KB)。
* @throws IOException 如果發生任何輸入/輸出例外
*/
public static void copyStream(InputStream in, OutputStream os,
int bufferSize) throws IOException {
int len = -1;
byte[] b = new byte[bufferSize * 1024];
嘗試 {
while ((len = in.read(b, 0, b.length)) != -1) {
os.write(b, 0, len);
}
作業系統刷新();
} 最後 {
如果 (in != null) {
嘗試 {
附寄();
} catch (IOException e) {
e.printStackTrace();
}
}
如果 (os != null) {
嘗試 {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
執行
為了複製範例程式文件,我在 C 盤根目錄下創建了一個名為“100M.txt”的 100MB 文件。在範例程式中, C:\100M.txt 資料以 1000KB 的緩衝區大小讀取。 C:\a.txt 將其複製到[此位置]。
樣本在以下環境下運作。
作業系統:Windows XP
CPU:Athlon 1.46GHz
記憶體:1GB
JRE:1.6.4
◆範例
/** * 執行範例 * @param args */ public static void main(String[] args) { try { copyStream("C:\\100M.txt", "C:\\a.txt",1000); } catch (IOException e) { e.print } }
更改緩衝區大小
為了在複製檔案時確定有效的資料讀取緩衝區大小,應該將 copyStream 的第三個參數設為
以下總結了以 1KB、100KB、1000KB 和 10000KB 為單位執行相同複製過程的結果。

雖然我們不能僅根據上述結果得出明確的結論,但如果資料讀取緩衝區大小以 1000KB 為單位指定,
結果表明,該系統在複製操作期間的堆記憶體使用率和處理時間方面都很高效。
此外,即使檔案大小增加(到大約 1GB),也獲得了類似的結果。
相反,複製小檔案(大約 1MB 或更小)時,增加緩衝區大小是沒有意義的,所以最好指定大約 100KB。
使用檔案通道可獲得更快的速度
java.io.InputStream、java.io.OutputStream
複製對於理解輸入/輸出流至關重要,但是
J2SE1.4 中引入了新的 I/O java.nio.channels.FileChannel#transferTo
使用這種方法,您可以更有效率地複製文件。
接下來,我將向您展示如何使用 FileChannel 輕鬆快速地複製文件。
⇒ Java 檔案複製(簡單快速)

