如果读写文件:一定首选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.32Mapped Write:0.03
Stream Read: 0.31
Mapped Read: 0.03
Stream Read/Write: 5.87
Mapped Read/Write: 0.00