2013-04-04 221 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));