2013-04-04 89 views
4

我想使用文件utils複製文件方法複製文件。我正在運行中的一些問題,其中一個例外是有時拋出使用FileUtils.copyFile複製文件

java.io.IOException: Failed to copy full contents from 'path.xml' to localfile.xml

我用Google搜索,並在代碼中看出,這個例外是當目標文件長度是到目標文件長度不同的拋出,異常只發生了一些時間 - 這可能是由於我試圖複製的文件是持續更新的事實,所以我可能會捕獲它中間更新(只是一個xml文件的值更改)

如果我將呼叫一個if(target.canRead())但這似乎沒有什麼區別。

任何人都可以幫忙嗎?

* 更新: *我無法鎖定文件,因爲它正在通過第三方供應商寫入,這會導致各種問題。

+0

我建議使用[谷歌番石榴API(https://code.google.com/ p/guava-libraries /)[Files Class](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/Files.html), – ajduke 2013-04-04 07:53:28

+2

爲什麼用這個fileutils? – Biscuit128 2013-04-04 08:02:10

+0

,因爲它具有Files.copy(src,dest)方法及其Google Guava庫,並且我在所有Java projets中都使用它,但迄今未找到問題。 – ajduke 2013-04-05 11:11:54

回答

0

我不確定如何在您的項目中實現架構,但您應該在文件上有鎖定機制。

當有人正在寫入文件時,應該鎖定它。而且在寫入的時候,你不應該從它那裏複製它,即它被鎖定。

FileInputStream in = new FileInputStream(file); 
try { 
    java.nio.channels.FileLock lock = in.getChannel().lock(); 
    try { 
     Reader reader = new InputStreamReader(in, charset); 
     ... 
    } finally { 
     lock.release(); 
    } 
} finally { 
    in.close(); 
} 

看到這個問題here關於如何在java中鎖定一個文件。

UPDATE

你那麼別無選擇,只能自己實現或使用不具有類似的檢查庫複製方法離開。

你可以看到FileUtils

的代碼,如果複製過程中文件更改它會給錯誤。

 if (srcFile.length() != destFile.length()) { 
      throw new IOException("Failed to copy full contents from '" + 
        srcFile + "' to '" + destFile + "'"); 
     } 
+0

我無法鎖定文件,請參閱更新 – Biscuit128 2013-04-04 07:52:44

0

就像你說的那樣,在複製過程中文件可能會被更新,所以你應該被要求在你想複製的文件上獲得文件鎖定。

我建議您閱讀this question以獲取有關如何使用FileLock的一些詳細信息。

0

我有同樣的問題(大文件)在Java 7中使用文件解析:

File srcFile = ... 
File destFile = ... 
File directory = ... 
if (!Files.exists(directory.toPath())) { 
    // use forceMkdir to create parent directory 
    FileUtils.forceMkdir(directory); 
} 
Files.copy(srcFile.toPath(), new FileOutputStream(destFile));