只要我能理解java api,使用“rw”打开RandomAccessFile就不会在底层存储设备上同步写入错误的单字节。与“rws”或“rwd”不同 为什么它与“rw”的无缓冲FileOutputStream几乎相同“速度”,“rws”/“rwd”慢10倍以上?
以下简单的代码显示了这一点,我无法得到任何合理的解释。任何线索?
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
public class StreamTest {
public static void main(String[] args) throws Exception {
OutputStream os;
RandomAccessFile raf;
int size = 10000;
File file = new File("test.log");
long a=System.currentTimeMillis();
os = new FileOutputStream(file);
for(int i=0;i<size;i++){
os.write(("1").getBytes());
}
os.close();
long b=System.currentTimeMillis();
System.out.println("writing direct "+(b-a));
raf = new RandomAccessFile(file,"rws");
for(int i=0;i<size;i++){
raf.write(("1").getBytes());
}
raf.close();
long c=System.currentTimeMillis();
System.out.println("random access write "+(c-b));
raf = new RandomAccessFile(file,"rw");
for(int i=0;i<size;i++){
raf.write(("1").getBytes());
}
raf.close();
long d=System.currentTimeMillis();
System.out.println("random access optimized write "+(d-c));
}
}
答案 0 :(得分:3)
从docs开始,rws模式意味着:
开放阅读和写作,如同 “rw”,也要求每一个 更新到文件的内容或 元数据可以同步写入 底层存储设备。
理所当然地说,强制将文件的内容写入底层设备将比其他方法慢得多,这可能允许VM / OS缓存写入。
答案 1 :(得分:0)
似乎与系统有关:我运行了你的代码并得到了:
writing direct 116
random access write 611
random access optimized write 39
操作系统:Linux 2.6.9
JVM:
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Server VM (build 1.6.0-b105, mixed mode)