Mega Code Archive

 
Categories / Java / File Input Output
 

Mapped IO

// : c12:MappedIO.java // {Clean: temp.tmp} // From 'Thinking in Java, 3rd ed.' (c) Bruce Eckel 2002 // www.BruceEckel.com. See copyright notice in CopyRight.txt. import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.IntBuffer; import java.nio.channels.FileChannel; public class MappedIO {   private static int numOfInts = 4000000;   private static int numOfUbuffInts = 200000;   private abstract static class Tester {     private String name;     public Tester(String name) {       this.name = name;     }     public long runTest() {       System.out.print(name + ": ");       try {         long startTime = System.currentTimeMillis();         test();         long endTime = System.currentTimeMillis();         return (endTime - startTime);       } 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();       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 (int i = 0; i < tests.length; i++)       System.out.println(tests[i].runTest());   } } ///:~