使用FileUtils.copyFile复制文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用FileUtils.copyFile复制文件相关的知识,希望对你有一定的参考价值。

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

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

我已经google搜索并在代码中看到当目标文件长度与目标文件长度不同时抛出此异常,异常仅发生一些时间 - 这可能是由于我尝试复制的文件是一致的更新,所以我可能会在更新中捕获它(只是一个值更改的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中锁定文件,请参阅此问题here

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));
另一答案

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

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

以上是关于使用FileUtils.copyFile复制文件的主要内容,如果未能解决你的问题,请参考以下文章

大哥……我想问一下啊,用FileUtils.copyFile上传文件的时候有没有最大值限制?有的话怎么解决?

Java基础知识 18通过FileUtils.copyFile探索IO原理

java _io_commons 拷贝文件和网页内容

如何在idea中设置Tomcat虚拟路径

Appium常用APi03

appium 截屏和滑动功能