我尝试使用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());
但这仍然存在两个问题。
如果count>pos,您将覆盖源区域。
transferTo()必须在循环中调用,因为它不能保证在一个调用中竞争整个传输。它返回实际传输的字节数,