为什么java RandomAccessFile比FileOutputStream慢得多?

为什么java RandomAccessFile比FileOutputStream慢得多?,java,Java,只要我能理解java api,使用“rw”打开RandomAccessFile就不会在底层存储设备上同步写入服务器单字节。与“rws”或“rwd”不同。 为什么它的“速度”与“rw”的无缓冲FileOutputStream几乎相同,而“rws”/“rwd”的速度要慢10倍以上 下面的简单代码显示了这一点,对此我无法得到任何合理的解释。有线索吗 import java.io.File; import java.io.FileOutputStream; import java.io.OutputSt

只要我能理解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));
  }
}
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.OutputStream;
导入java.io.RandomAccessFile;
公共类流测试{
公共静态void main(字符串[]args)引发异常{
输出流;
随机文件raf;
int size=10000;
File File=新文件(“test.log”);
长a=System.currentTimeMillis();
os=新文件输出流(文件);

for(int i=0;i似乎与系统有关:我运行了您的代码并获得:

writing direct 116
random access write 611
random access optimized write 39
操作系统:Linux 2.6.9

JVM:

从中,rws模式意味着:

开放阅读和写作,如 “rw”,并且还要求 更新文件的内容或 元数据不能同步写入 底层存储设备


显然,强制将文件内容写入底层设备的速度要比其他方法慢得多,因为其他方法可能允许VM/OS缓存写入操作。

这是哪种类型的系统/VM/磁盘?
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)