使用FileUtils.copyFile复制文件

时间:2013-04-04 07:44:27

标签: java file exception copy

我正在尝试使用文件utils copy file方法复制文件。我正在遇到一些有时抛出异常的问题

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

我已经google搜索并在代码中看到当目标文件长度与目标文件长度不同时抛出此异常,异常仅发生一些时间 - 这可能是由于我正在尝试的文件这​​一事实复制是一致的更新,所以我可能会在更新中找到它(只是一个值改变的xml文件)

如果我将呼叫包裹在if(target.canRead())中,但这似乎没什么区别。

有人可以帮忙吗?

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

3 个答案:

答案 0 :(得分:1)

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

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

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中锁定文件。

<强>更新

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

您可以看到FileUtils

的代码

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

我建议您阅读this question以获取有关如何使用FileLock的详细信息。