为什么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)); } }
- 如何以编程方式生成按键Android
- 为什么不能保护java主类?
- 在Android中,如何仅针对特定路径中的文件查询MediaStore? 或者,只显示特定路径中的文件?
- 如何使用Jsoup获取表单validation码图像?
- 使用java api将文件上传到google驱动器
从文档中 ,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)