首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么java RandomAccessFile比FileOutputStream慢这么多?

问为什么java RandomAccessFile比FileOutputStream慢这么多?
EN

Stack Overflow用户
提问于 2011-06-15 05:14:51
回答 3查看 8K关注 0票数 3

据我所知,使用"rw“打开RandomAccessFile不会在底层存储设备上同步写入每一个字节。与"rws“或"rwd”不同。

为什么它和使用"rw“的无缓冲FileOutputStream的”速度“几乎相同,而使用"rws"/"rwd”的速度要慢10倍以上?

下面的简单代码显示了这一点,我无法得到任何合理的解释。有什么线索吗?

代码语言:javascript
复制
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));
  }
}
EN

回答 3

Stack Overflow用户

发布于 2011-06-15 05:35:51

在docs中,rws模式意味着:

为读写而打开,就像"rw“一样,还要求对文件内容或元数据的每次更新都要同步写入底层存储设备。

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

票数 3
EN

Stack Overflow用户

发布于 2021-08-12 21:58:28

出于好奇,我更改了100000次,并在Android7.1 Zebra TC20上测试了这段代码,得到了以下代码:

代码语言:javascript
复制
writing direct 2871    
random access write 99371    
random access optimized write 2426
票数 1
EN

Stack Overflow用户

发布于 2011-06-15 05:33:18

看起来依赖于系统:我运行了你的代码,得到了:

代码语言:javascript
复制
writing direct 116
random access write 611
random access optimized write 39

操作系统: Linux 2.6.9

JVM:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6350269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档