old stream I/O new nio mapped file performance

来源:互联网 发布:网络推广微商seocnm 编辑:程序博客网 时间:2024/06/04 19:49

如果读写文件:一定首选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


0 0