为什么Java RandomAccessFile比FileOutputStream慢得多?

问题描述

| 只要我能理解Java api,使用\“ rw \”打开RandomAccessFile不会在基础存储设备上同步写入每个单个字节。与\“ rws \”或\“ rwd \”不同。 为什么它的“速度”几乎与无缓冲的FileOutputStream和“ rw”相同,而与“ rws \” /“ rwd”相比却慢了十倍? 下面的简单代码显示了这一点,对此我无法得到任何合理的解释。有什么线索吗?
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));
  }
}
    

解决方法

        从文档中,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)