2010-03-30 48 views

回答

2

如果 「本土」 你的意思是「Java標準的一部分API「(而不是依賴於平臺的代碼,在Java世界中通常被稱爲」本機「),而」複製文件「則意味着」採用文件和目標路徑並生成文件內容副本的單一方法「那麼不,標準API中沒有這樣的方法。您必須打開一個InputStream和一個OutputStream(可以選擇更高效的FileChannel s)並使用緩衝區來傳輸字節。在Apache Commons IO中可以找到方便的單一方法。

更新:由於Java 7,文件複製功能已經成爲了標準API的一部分java.nio.file.Files

+0

糾正我,如果我錯了,但本機在Java世界通常意味着依賴於平臺的代碼... – Jon 2010-03-30 20:19:04

+0

nope,Java世界中的「本地」意味着它的平臺相關的代碼,也就是代碼被編譯並在平臺上本地運行。雖然標準API是獨立於平臺的,通常用Java編寫,但該代碼將作爲JVM中的字節代碼運行 - 理論上,至少字節代碼始終是相同的,無論您處於何種平臺。 – KingInk 2010-03-30 20:32:30

+1

@Jon,KingInk:* I *知道 - 但它懷疑湯姆沒有。 – 2010-03-30 20:51:31

2

你最好的選擇是使用Java NIO:

http://java.sun.com/javase/6/docs/api/java/nio/package-summary.html

對於緩衝區看到:

http://java.sun.com/javase/6/docs/api/java/nio/package-summary.html#buffers

對於流然而,看看下面的文章:

http://java.sun.com/docs/books/tutorial/essential/io/file.html#readStream

有建立在此之上的框架,即米娜和Netty的:

+0

謝謝!並添加到您的列表Apache Commons IO,它非常好! – 2010-03-31 12:44:59

3

這是複製一個文件,因爲JDK 1.4和首選方式後

public static void copyFile(final File sourceFile, final File destFile) throws IOException 
{ 
    if (!destFile.exists()) 
    { 
     destFile.createNewFile(); 
    } 

    FileChannel source = null; 
    FileChannel destination = null; 
    try 
    { 
     source = new FileInputStream(sourceFile).getChannel(); 
     destination = new FileOutputStream(destFile).getChannel(); 
     destination.transferFrom(source, 0, source.size()); 
    } 
    finally 
    { 
     source.close(); 
     destination.close(); 
    } 
} 

public abstract long transferFrom(ReadableByteChannel src, long position, long count) throws IOException

...這種方法可能比一個簡單的循環更有效 從此通道讀取並寫入目標通道 。許多操作 系統可以將文件系統緩存中的字節 直接傳輸到目標通道 ,而實際上並不需要 將其複製。 ...

+0

你確定你不需要循環嗎? transferFrom()返回「實際傳輸的字節數,可能爲零」,就像InputStream.read() – 2010-03-30 20:54:05

+0

@Michael:Nope,'source.size()'指定需要傳輸的字節數。 @fuzzy:在這個例子中,'source.close()'拋出'IOException'時不會關閉'destination'。 – BalusC 2010-03-30 21:27:47

+0

@BalusC是的,但API文檔明確指出,該方法實際上可能不會傳輸那麼多字節。 – 2010-03-30 21:52:04

0

只是要補充一點,JDK7在java.nio.file.Files中定義了多個複製方法,包括複製文件和將文件複製到流中/從流中複製文件。