Java中使用内存映射实现大文件上传实例
在处理大文件时,如果利用普通的FileInputStream或者FileOutputStream抑或RandomAccessFile来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如下为一个对比实验。
packagetest;
importjava.io.BufferedInputStream; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.IOException; importjava.io.RandomAccessFile; importjava.nio.MappedByteBuffer; importjava.nio.channels.FileChannel;
publicclassTest{
publicstaticvoidmain(String[]args){ try{ FileInputStreamfis=newFileInputStream("/home/tobacco/test/res.txt"); intsum=0; intn; longt1=System.currentTimeMillis(); try{ while((n=fis.read())>=0){ sum+=n; } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } longt=System.currentTimeMillis()-t1; System.out.println("sum:"+sum+" time:"+t); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }
try{ FileInputStreamfis=newFileInputStream("/home/tobacco/test/res.txt"); BufferedInputStreambis=newBufferedInputStream(fis); intsum=0; intn; longt1=System.currentTimeMillis(); try{ while((n=bis.read())>=0){ sum+=n; } }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } longt=System.currentTimeMillis()-t1; System.out.println("sum:"+sum+" time:"+t); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }
MappedByteBufferbuffer=null; try{ buffer=newRandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE,0,1253244); intsum=0; intn; longt1=System.currentTimeMillis(); for(inti=0;i<1253244;i++){ n=0x000000ff&buffer.get(i); sum+=n; } longt=System.currentTimeMillis()-t1; System.out.println("sum:"+sum+" time:"+t); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }
}
}