FileChannel.transferFrom用于转移文件内容

时间:2014-04-16 20:07:55

标签: java io

我尝试使用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 Docs没有说明源和目标是同一个文件的情况。

1 个答案:

答案 0 :(得分:0)

您正在转移'计数'字节从 0开始来自' rafOld'对于没有对其进行任何搜索的“rafNew”,所以也处于零位。所以你的代码充其量只能做你所说的。你在' rafOld'上做的搜索()不会影响transferTo()操作。你应该删除它并写上

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

但这仍有两个问题。

  1. 如果计数>你将覆盖源区域。

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