使用FileUtils.copyFile复制文件

我试图使用文件utils复制文件方法复制文件。 我正在遇到一些有时抛出exception的问题

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

我在google搜索并在代码中看到当目标文件长度与目标文件长度不同时抛出此exception,exception仅发生一些时间 – 这可能是由于我尝试复制的文件是一致的更新所以我可能会在更新中捕获它(只是一个值更改的xml文件)

如果我将调用包装在if(target.canRead())但这似乎没什么区别。

有人可以帮忙吗?

* 更新: *我无法锁定文件,因为它是通过第三方供应商写入的,这会导致各种问题。

我不确定如何在您的项目中实现该体系结构,但您应该在该文件上有一个锁定机制。

当某人正在写文件时,它应该锁定它。 并且你不应该在写入时复制它,即它被锁定。

 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(); } 

请在此处查看有关如何在java中锁定文件的问题。

UPDATE

然后你没有选择,只能自己实现复制方法或使用没有类似检查的库。

您可以看到FileUtils的代码

如果文件在复制期间发生更改,则会出错。

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

我使用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)); 

正如您所说,在复制过程中文件可能会更新,因此您应该要求对要复制的文件进行文件锁定。

我建议阅读这个问题,以获得有关如何使用FileLock详细信息。