import java.nio.*;
import java.nio.channels.*;
public class MappedIO
{
private static int numOfInts = 4000000;
private static int numOfUnbufferInts = 2000000;
private abstract static class Tester
{
private String name;
private Tester(String name)
{
this.name = name;
}
public long runTime()
{
System.out.print(name + ":");
try
{
long beginTime,endTime;
beginTime = System.currentTimeMillis();
test();
endTime = System.currentTimeMillis();
return endTime-beginTime;
}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 RandomAccessFile("temp.tmp","rw").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("temp.tmp","rw");
raf.writeInt(1);
for (int i=0;i<numOfUnbufferInts;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("temp.tmp","rw").getChannel();
IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE,0,fc.size()).asIntBuffer();
ib.put(0);
for (int i=1;i<numOfUnbufferInts;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].runTime());
}
}