Java 檔案複製(簡單快速)文件通道#傳輸到
在 Java 中複製文件以下是一個演示此功能的範例程式。
此範例程式使用了 J2SE 1.4 中引入的 New I/O。 java.nio.channels.FileChannel#transferTo 我們將採用這種方法。
這樣一來,您就可以編寫複製程式而無需擔心讀取資料所需的緩衝區,從而實現最簡單的編碼。
什麼是通道?
「渠道」一詞有多種意義,
基本上,它似乎是指不同設備之間資料輸入和輸出的傳輸路徑。java.nio.channels.FileChannel 此類表示用於讀取和寫入檔案的連接。
轉移至 此方法可以將位元組資料從來源檔案傳輸到目標通道。
以下摘自 Java API 文件。
transferTo(long position, long count, WritableByteChannel target)
此命令將此通道上的檔案中的位元組傳輸到指定的可寫入位元組通道。
這種方法可能比簡單的循環(從目前通道讀取資料並將其寫入目標通道)更有效率。許多作業系統可以直接將位元組從檔案系統快取傳輸到目標通道,而無需複製位元組。
驗證結果表明,使用常規流是其中一種方法。
與其他使用 FileChannel 的方法(例如使用 ByteBuffer#allocateDirect 方法)相比,這種方法可以實現更快的複製速度。
範例程式
FileChannel srcChannel = new
FileInputStream(srcPath).getChannel();
文件通道 destChannel = new
FileOutputStream(destPath).getChannel();
嘗試 {
srcChannel.transferTo(0, srcChannel.size(), destChannel);
} 最後 {
srcChannel.close();
目標通道關閉();
}
}
執行
為了複製範例程式文件,我在 C 盤下直接建立了一個名為「100M.txt」的 100MB 文件。
在範例程式中… C:\100M.txt 複製此內容 C:\a.txt 建立以下文件。
樣本在以下環境下運作。
作業系統:Windows XP
CPU:Athlon 1.46GHz
記憶體:1GB
JRE:1.6.4
◆範例
/** * 執行範例 * @param args */ public static void main(String[] args) { try { copyTransfer("C:\\100M.txt", "C:\\a.txt"); } catch (IOException e) { e.printStackTrace(); }
文件通道#傳輸到 在使用方法的複製操作中
複製一個 100MB 檔案的過程大約耗時 3 秒。複製過程中堆記憶體使用量也約為 300KB。
順便一提,Java 檔案複製(更改緩衝區大小)那裡描述的方法,
當指定最有效的緩衝區大小為 1000KB 時,處理時間約為 4 秒,堆使用量約為 1300KB。
即使採用基於流的檔案複製方式,也可以透過調整緩衝區大小來加快複製速度。
對於複製單一文件的過程,這兩種方法之間並沒有太大區別。
但是,當順序複製大檔案或並行運行多個複製操作時,FileChannel 在處理速度和堆疊使用方面可能非常有效。

