如果源目标相同,Java中的fileoutputstream会生成零字节吗?

时间:2014-02-05 08:14:08

标签: java fileinputstream fileoutputstream filechannel

我们使用类似的代码在Java中使用filecopy:

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

问题有时sourcedest可以指向同一个文件,在这种情况下,以下语句outputChannel = new FileOutputStream(dest).getChannel();导致源截断为0字节,即使源到目前为止是400 kb,因为我认为它打开了一个用相同句柄写入的流。那么解决这个问题的方法是什么呢?

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

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

上述工作会不会?或者有更好的方法来解决这个问题吗?

谢谢

1 个答案:

答案 0 :(得分:1)

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