作为每API,这些都是事实:RandomAccessFile.seek()如何工作?
- 的
seek(long bytePosition)
方法简单地说,将指针移动到 与bytePosition
参数指定的位置。 - 当
bytePosition
大于文件长度时,文件 长度不会改变,除非在(新)结束处写入一个字节。 - 如果数据以跳过的长度存在,则这些数据不会被触发,而是保留 。
不过,我很好奇的情况是:当有没有数据(0字节)的文件,我执行下面的代码:
file.seek(100000-1);
file.write(0);
所有100,000字节几乎立即填满0
。比如说,我可以在10毫秒内超过200GB。
但是,当我尝试使用其他方法(例如BufferedOutputStream
)写入100000字节时,同一个过程需要几乎无限长的时间。
这种时间差异的原因是什么?有没有更有效的方法来创建n
字节的文件并填写0
?
编辑: 如果数据没有实际写入,那么文件如何填充数据? 样品验证码:
RandomAccessFile out=new RandomAccessFile("D:/out","rw");
out.seek(100000-1);
out.write(0);
out.close();
这是输出:
另外,如果该文件是足够庞大的我不能再写入磁盘,由于缺乏空间。
我的猜测是文件大小是“注意到”的,但实际的块没有写入磁盘。冲洗/关闭需要多长时间? (请参阅这里http://stackoverflow.com/a/257849/540873) –
我的猜测是一样的,但我打开文件并检查它。当我没有写最后一个字节时,它是空的,结果文件大小为0字节。当我写完最后一个字节时,直到最后一个字节的每个字节都填充0,文件大小作为输入。包含close()操作的整个过程是问题中指定的时间(这就是为什么我很惊讶!) – SirVirgin
当您阅读该方法的源代码时,您不明白什么?在请求别人阅读它之前,确实已经阅读了信息来源,你是否为你工作了吗? –