为什么java RandomAccessFile比FileOutputStream慢得多?

只要我能理解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 "+(ba)); 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 "+(cb)); 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 "+(dc)); } } 

从文档中 ,rws模式意味着:

打开以进行读写,与“rw”一样,并且还要求将文件内容或元数据的每次更新同步写入底层存储设备。

按理说,强制将文件的内容写入底层设备将明显慢于其他方法,这可能允许VM / OS缓存写入。

似乎与系统有关:我运行了你的代码,得到了:

 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)