我尝试使用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没有说明源和目标是同一个文件的情况。
答案 0 :(得分:0)
您正在转移'计数'字节从 0开始来自' rafOld'对于没有对其进行任何搜索的“rafNew”,所以也处于零位。所以你的代码充其量只能做你所说的。你在' rafOld'上做的搜索()不会影响transferTo()操作。你应该删除它并写上
transferTo(pos, count, rafNew.getChannel());
但这仍有两个问题。
如果计数>你将覆盖源区域。
必须在循环中调用transferTo(),因为它不能保证在单个调用中竞争整个传输。它返回实际传输的字节数,