【发布时间】:2017-08-09 06:44:25
【问题描述】:
我目前正在使用 RandomAccessFile 并遇到一个奇怪的现象。 我正在访问一个 1.1TB 大且仅包含等于 00000000 的字节的文件。
我通过以下方式实现了 RandomAccessFile:
RandomAccessFile raf = new RandomAccessFile(new File("./db.bin"),"rw");
所以我的程序正在生成一个代表 BIT 位置的 Long 值的大列表,一旦达到 1000 个条目,它会将数据刷新到文件中:
public void flush() {
for( long l : lLongs ) {
lseek = Long.divideUnsigned(l, 8L);
raf.seek( lseek );
byte b = raf.readByte();
raf.seek( lseek );
raf.writeByte( editByte(b,(int)l % 8) );
}
raf.close();
}
public byte editByte( byte b, int iBit ) {
if( !isSet(b,iBit) ) {
b = (byte)(b + Math.pow( 2, iBit));
}
return b;
}
boolean isSet(byte value, int bit){
return (value >> bit & 1) == 1;
}
现在我想知道为什么需要这么长时间?对于 1000 个条目,平均需要 15 秒。 但是如果我取消我的程序并重新启动它,我将只需要 5ms 输入 1000 个条目(多头保持相同)
这是为什么呢?有人可以帮我解决这个问题吗?
【问题讨论】:
-
这是一个二进制文件,不是文本文件,所以它不应该有 .txt 扩展名。
-
固定文件扩展名
-
答案在于缓存启动。第二次,操作系统缓存了最近读取的文件。
标签: java io randomaccessfile