使用FileUtils.copyFile复制文件

问题描述 投票:5回答:3

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

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

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

如果我用if(target.canRead())包裹这个电话,但这似乎没什么区别。

有人可以帮忙吗?

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

java file exception copy
3个回答
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();
}

有关如何在java中锁定文件,请参阅此问题here

UPDATE

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

你可以看到FileUtils的代码

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

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

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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.