5

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

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

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

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

任何人都可以帮忙吗?

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

4

3 回答 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 中锁定文件的问题。

更新

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

可以看FileUtils的代码

如果在复制过程中文件更改,它将给出错误。

        if (srcFile.length() != destFile.length()) {
            throw new IOException("Failed to copy full contents from '" +
                    srcFile + "' to '" + destFile + "'");
        }
于 2013-04-04T07:51:03.167 回答
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));
于 2014-12-11T12:45:01.390 回答
0

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

我建议阅读这个问题以获取有关如何使用FileLock.

于 2013-04-04T07:50:28.987 回答