old stream IOnew niomapped file performance

xiaoxiao2021-02-28  107

如果读写文件:一定首选mapped file ,花的时间可以忽略。

一、I/O流 

        1、输出   FileOutputStream----BufferedOutputStream---DataOutputStream

        2、输入   FileInputStream----BufferedInputStream---DataIntputStream

        3、先读再写  new RandomAccessFile(new File("temp.tmp"),"rw")  -----可以定位到一个地方后----writeInt(raf.readInt()); 先读数据再写进

二、mapped file         

      1、   输出: RandomAccessFile----getChannel(FileChannel)---IntBuffer 写数据 put(i)

                        这个好像可以用FileOutputStream,但是书中规定输出时只能用RandomAccessFile 这类,我测试时也出错。

      2、   输入:  FileInputStream----getChannel(FileChannel)---IntBuffer  get() 读数据

      3、  先读再写:  RandomAccessFile------getChannel(FileChannel)--IntBuffer 写数据 put(ib.get(i - 1)) 先读数据再写进。

三、这个类用到:Template Method  runTest() 建立测试框架。 

       1、有一个 test() 方法

       2、匿名的内部类 包括此方法:实现其不同功能。

package io;

import java.nio.*; import java.nio.channels.*; import java.io.*; public class MappedIO { private static int numOfInts = 4000000; //4M  private static int numOfUbuffInts = 200000; private abstract static class Tester { private String name; public Tester(String name) { this.name = name; } public void runTest() { System.out.print(name + ": "); try { long start = System.nanoTime(); test(); double duration = System.nanoTime() - start; System.out.format("%.2f\n", duration / 1.0e9); } catch (IOException e) { throw new RuntimeException(e); } } public abstract void test() throws IOException; } private static Tester[] tests = { new Tester("Stream Write") { public void test() throws IOException { DataOutputStream dos = new DataOutputStream( new BufferedOutputStream(new FileOutputStream(new File("temp.tmp")))); for (int i = 0; i < numOfInts; i++) dos.writeInt(i); dos.close(); } }, new Tester("Mapped Write") { public void test() throws IOException { FileChannel fc = new RandomAccessFile("temp.tmp", "rw").getChannel(); System.out.println("fc.size():"+fc.size()); IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()) .asIntBuffer(); for (int i = 0; i < numOfInts; i++) ib.put(i); fc.close(); } }, new Tester("Stream Read") { public void test() throws IOException { DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("temp.tmp"))); for (int i = 0; i < numOfInts; i++) dis.readInt(); dis.close(); } }, new Tester("Mapped Read") { public void test() throws IOException { FileChannel fc = new FileInputStream(new File("temp.tmp")).getChannel(); IntBuffer ib = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()).asIntBuffer(); while (ib.hasRemaining()) ib.get(); fc.close(); } }, new Tester("Stream Read/Write") { public void test() throws IOException { RandomAccessFile raf = new RandomAccessFile(new File("temp.tmp"),"rw"); raf.writeInt(1); for (int i = 0; i < numOfUbuffInts; i++) { raf.seek(raf.length() - 4); raf.writeInt(raf.readInt()); } raf.close(); } }, new Tester("Mapped Read/Write") { public void test() throws IOException { FileChannel fc = new RandomAccessFile(new File("temp.tmp"), "rw").getChannel(); IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()) .asIntBuffer(); ib.put(0); for (int i = 1; i < numOfUbuffInts; i++) ib.put(ib.get(i - 1)); fc.close(); } } }; public static void main(String[] args) { for (Tester test : tests) test.runTest(); } }

结果:

Stream Write: 0.32 Mapped Write:0.03 Stream Read: 0.31 Mapped Read: 0.03 Stream Read/Write: 5.87 Mapped Read/Write: 0.00

转载请注明原文地址: https://www.6miu.com/read-66520.html

最新回复(0)