FileChannel.transferFrom以转移文件内容



我尝试使用FileChannel.transferFrom将文件的一些内容移动到开头。

try (RandomAccessFile rafNew = new RandomAccessFile(_fileName, "rw");
        RandomAccessFile rafOld = new RandomAccessFile(_fileName, "r");) 
{
        rafOld.seek(pos);
        rafOld.getChannel().transferTo(0, count, rafNew.getChannel());
} catch (IOException e) {
        throw new RuntimeException(e.getMessage());
}

这样做的结果是一个具有奇怪重复数据的文件。如果我首先将数据传输到缓冲区文件,然后从缓冲区文件再次传输回原始文件,则该示例有效。

Java文档没有说明源和目标是同一个文件的情况。

您正在将从zero开始的"count"字节从"rafOld"转移到"rafNew",后者尚未进行任何查找,因此也位于零位置。所以,你的代码充其量不会按照你所说的去做。您在"rafOld"上执行的seek()操作不会影响transferTo()操作。你应该删除它并写

transferTo(pos, count, rafNew.getChannel());

但这仍然存在两个问题。

  1. 如果count>pos,您将覆盖源区域。

  2. transferTo()必须在循环中调用,因为它不能保证在一个调用中竞争整个传输。它返回实际传输的字节数,

最新更新