2009-11-10 36 views
1

我想知道哪些是複製大量文件的最佳方式。java - 有效的文件複製

+0

從哪裏複製到哪裏?本地?通過網絡? – 2009-11-10 08:57:50

+0

只在本地複製 – michal 2009-11-10 09:03:25

+1

是的,您需要詳細說明。你的目標是什麼? – 2009-11-10 09:12:24

回答

4

如果你在本地複製文件,你應該使用FileChannel.transferFrom()或FileChannel.transferTo()。例如:

 
FileInputStream is = new FileInputStream(file); 
FileOutputStream fos = new FileOutputStream(oFile); 
FileChannel f = is.getChannel(); 
FileChannel f2 = fos.getChannel(); 

f.transferTo(0, f.size(), f2); 

f2.close(); 
f.close(); 

在許多平臺上,複製將通過DMA發生,大約儘可能快。

如果要複製文件在網絡上,那麼你是在一個不同的情況。在一些文件可能已經存在的情況下,那麼你應該看看rsync,因爲它可以避免傳輸兩側相同的文件的部分。如果最常見的情況是這些文件不會在目標機器上存在,那麼您將需要使用類似scp的文件。對此,請參閱this問題。

+0

+1:愛上DMA。但恐怕大多數孩子都不太瞭解。 http://en.wikipedia.org/wiki/Direct_memory_access – 2009-12-28 18:38:11

2

「最佳」 需要澄清。

我會委託給rsync的是在拷貝大量文件有很多的選擇非常好。我沒有意識到rsync的Java實現。

2

退房來自谷歌的guavaFiles類。它包含一些用於複製整個文件的實用方法。

+0

唯一的問題是,沒有發佈的番石榴版本尚未發佈 - 唯一的選擇是從他們的svn中檢查幹線源。 (糾正我,如果我錯了。) – Jonik 2009-11-10 09:35:56

+0

番石榴已經發布了很長一段時間,現在 – David 2012-01-20 00:25:48

2
+0

在撰寫本書的時候,FileUtils.copyFile()使用IOUtils.copy(),它只是從InputStream讀取和寫入到的OutputStream。它沒有做任何事情來檢測你有一個FileInputStream和一個FileOutputStream的特殊情況,所以可以通過通道進行更快的複製。所以,如果目標是儘可能快地完成複製*和*副本是本地的,那麼這將不是最快的方式。 不會是最快的方法。 – uckelman 2009-11-10 11:05:59