【问题标题】:Copying a file using FileUtils.copyFile使用 FileUtils.copyFile 复制文件
【发布时间】:2013-03-26 04:17:33
【问题描述】:

我正在尝试使用文件实用程序复制文件方法复制文件。我遇到了一些有时会抛出异常的问题

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

我已经用谷歌搜索并在代码中看到,当目标文件长度与目标文件长度不同时会引发此异常,该异常仅发生几次 - 这可能是由于我正在尝试的文件副本一直在更新,所以我可能会在更新中捕捉到它(只是一个值变化的 xml 文件)

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

谁能帮忙?

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

【问题讨论】:

  • 我建议使用Google guava API Files Class,
  • 为什么在 fileutils 上使用它?
  • 因为它有 Files.copy(src,dest) 方法和它的 Google Guava 库,并且我在所有 Java 项目中都使用它,所以到目前为止没有发现问题。
  • 真正的问题是你为什么要复制一个仍在写入的文件?

标签: java file exception copy


【解决方案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】:

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

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

    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 + "'");
            }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 2012-01-24
        • 2016-04-22
        • 2011-01-23
        • 2016-12-28
        • 2018-09-25
        • 2014-10-14
        相关资源
        最近更新 更多