为什么Java中的RandomAccessFile比FileOutputStream慢这么多?

7
只要我能理解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));
  }
}

这是在哪种类型的系统/虚拟机/磁盘上运行的? - Paŭlo Ebermann
3个回答

5
根据文档,rws模式表示:
打开文件以便读取和写入,就像“rw”一样,并且要求将对文件内容或元数据的每次更新同步写入底层存储设备。
这意味着强制将文件内容写入底层设备的速度会明显变慢,而其他方法可能允许VM / OS缓存写入。

3

出于好奇,我将其更改为100000次并在Android 7.1 Zebra TC20上进行了测试,结果如下:

writing direct 2871    
random access write 99371    
random access optimized write 2426

2

这似乎与系统有关:我运行了您的代码,得到了以下结果:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接