0

我们使用类似的代码在 Java 中使用文件复制:

private void copyFileUsingFileChannels(File source, File dest) throws IOException {

    FileChannel inputChannel = null;
    FileChannel outputChannel = null;

    try {
        inputChannel = new FileInputStream(source).getChannel();
        outputChannel = new FileOutputStream(dest).getChannel();
        outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
    } finally {
        inputChannel.close();
        outputChannel.close();
    }
}

问题是有时source并且dest可以指向同一个文件,在这种情况下,以下语句outputChannel = new FileOutputStream(dest).getChannel();会导致源截断为 0 字节,即使源是 400 kb,因为我认为它正在打开一个用于写入的流相同的手柄。那么有什么方法可以对抗呢?

我应该在我的代码中添加一些内容吗

if (! (sourcec.getAbsolutePath().equalsIgnoreCase(destinationc.getAbsolutePath()))) 
    copyFiles(sourcec, destinationc);

上面的方法有用吗?或者有没有更好的方法来处理这个?

谢谢

4

1 回答 1

1

当您打开new FileOutputStream无附加模式时,如果文件存在,您将截断文件,如果不存在,则创建它。(追加模式不会帮助你,但不会截断文件)你想避免将文件复制到自身,所以我建议你做你建议的检查,或者使用你不尝试这样做的策略第一名。

于 2014-02-05T08:17:19.100 回答