2016-05-15 70 views
1

我正在開發一個基本的下載管理器,它可以使用多個連接通過http下載文件。在下載結束時,我有幾個臨時文件包含每個文件的一部分。用Java合併二進制文件的最佳方法

我現在想把它們合併成一個文件。

要做到這一點並不難,只需創建一個輸出流並輸入流,然後將輸入以良好的順序輸入輸出。

但我想知道:有沒有辦法更有效地做到這一點?我的意思是,根據我的理解,這裏將發生什麼是JVM將每字節讀取輸入字節,並將每個字節的輸出寫入字節。

所以基本上我有: - 內存 店字節 - - 從磁盤讀取 字節一些CPU指令可能會運行和字節可能會被複制到CPU的緩存 - 寫字節磁盤

我想知道是否有辦法在磁盤上保留進程?我不知道我是否可以理解,但基本上要告訴磁盤「嘿盤,把你的這些文件,並與他們一個」

在一個簡短的句子,我想減少CPU &內存使用情況儘可能最低。

+2

在這裏你去:https://thomaswabner.wordpress.com/2007/10/09/fast-stream-copy-using-javanio-channels/ – 2016-05-15 10:54:24

+0

連接文件是太罕見的操作,以添加到常見的低級別DOS操作。但上面的鏈接還有很長的路要走。請注意,它的一個優化是使用大小爲最常用磁盤頁面大小的大型中間緩衝區。 – usr2564301

+0

@RafaelOsipov:這看起來很不錯,謝謝 – Tiller

回答

2

理論上可以在文件系統級別執行此操作:您可以將塊列表從一個inode追加到另一個inode而不移動數據。但這不是很實用,很可能你必須繞過你的操作系統並直接訪問磁盤。

下一個最好的事情可以使用FileChannel.transferTo or transferFrom方法:

這種方法可能比一個簡單的循環,從該信道的讀取和寫入到所述目標信道有效得多。許多操作系統可以直接從文件系統緩存中將字節傳輸到目標通道,而無需實際複製它們。

您還應該使用流或RandomAccessFile測試讀取和寫入大塊字節 - 它可能仍然比使用通道更快。這裏有一篇關於testing sequential IO performance in Java的好文章。

+1

我跑了一些我自己的測試,對於大文件,它會出現頻道對我而言是最棒的。在我的測試案例中,速度快了5到10倍。謝謝。 – Tiller

相關問題