`
dlutqxq
  • 浏览: 19642 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

NIO中的内存映射文件使用对效率提高的验证

阅读更多

         对比较大的而不能放入内存的文件进行I/O操作时,如果使用NIO中的内存映射文件对性能效率和速度的提高是非常显著的。首先需要获取文件的通道,然后调用通道的map(FileChannel.MapMode mode,long position,long size)函数将文件从position位置开始的长度为size的内容映射到内存中。具体的效率比较代码示例如下:

       

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
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;

//测试代码是借用thingking in java中的
public class MappedIO {
	
	//先声明需要写入的文件的内容的大小
	private static final int NUMOFINT=4000000;
	private static final int NUMOFOUT=2000000;
	
	//测试类,用来测试使用普通的I/O操作和使用内存文件映射时速度的差别
	abstract static class Tester{
		private String name;
		public Tester(String name){
			this.name=name;
		}
		
		public void runTest(){
			System.out.println("使用"+name+"所消耗的时间:");
			try{
		    //以毫微秒为单位获取测试函数开始前的时间
			long begin=System.nanoTime();
			
			test();
			//将测试函数结束后的系统的时间减去开始之前的时间获取
			double duration=System.nanoTime()-begin;
			//PrintStream中的使用指定格式字符串和参数将格式化字符串写入此输出流中的方法
			System.out.format("%.2f\n", duration/1.0e9);
			}catch(IOException e){
				e.printStackTrace();
			}
		}
		
		//具体的测试函数中其实不仅有对文件进行读取或写入的时间,还包括消耗的各种初始化I/O对象的时间,而且内存映射文件的初始化对象消耗更要比普通的操作大
		public abstract void test() throws IOException;
	}
	
	private static Tester[] tests={
		//先使用普通的stream write,并且还是用了Buffered缓冲
		new Tester("stream write"){
			public void test()throws IOException{
				DataOutputStream dos=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("baolei.txt"))); 
			    for(int i=0;i<NUMOFINT;i++){
			    	dos.writeInt(i);
			    }
			    dos.close();
			}
		},
		//使用内存映射文件方式写入文件时的测试内部类
		new Tester("mapped write"){
			public void test() throws IOException{
				//利用RandomAccessFile初始化文件获取通道
				FileChannel fc=new RandomAccessFile("baolei.txt","rw").getChannel();
				//利用IntBuffer基本类型视图缓冲器来修改底层的ByteBuffer,实际上ByteBuffer是将数据移进移出通道的唯一方式
				IntBuffer ib=fc.map(FileChannel.MapMode.READ_WRITE, 0,fc.size()).asIntBuffer();
				for(int i=0;i<NUMOFINT;i++){
					ib.put(i);
				}
				
				fc.close();
			}
		},
		
		//下面的两个测试方法是测试read文件时的速度,基本和上面的两个一样
		new Tester("stream read"){
			public void test()throws IOException{
				DataInputStream dis=new DataInputStream(new BufferedInputStream(new FileInputStream("baolei.txt")));
				
				for(int i=0;i<NUMOFOUT;i++){
					dis.readInt();
				}
				dis.close();
			}
		},
		new Tester("mapped read"){
			public void test() throws IOException{
				FileChannel fc=new RandomAccessFile("baolei.txt","rw").getChannel();
				IntBuffer ib=fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
				while(ib.hasRemaining()){
					ib.get();
				}
				
				fc.close();
			}
		}

	};
	
	public static void main(String[] args){
		for(Tester test:tests){
			test.runTest();
		}
	}

}

 

   可以看到运行后的结果如下:

           使用stream write所消耗的时间:
           0.92
          使用mapped write所消耗的时间:
           0.12
          使用stream read所消耗的时间:
           0.50
         使用mapped read所消耗的时间:
           0.06
    效率确实大幅度提高啊。

     

 

          

分享到:
评论

相关推荐

    Java NIO 应用使用内存映射文件实现进程间通信

    Java NIO 应用 -- 使用内存映射文件实现进程间通信

    java nio 包读取超大数据文件

    Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...

    基于nio实现的多文件上传源码

    适合于文件小但数量比较大的文件传输 传输速度比传统的流IO要快很多,刚接触nio不久,希望有朋友能对它再进行优化,相信很多项目里用的上

    NIO处理大文件

    NIO 处理大文件

    JAVA NIO 按行读取大文件,支持 GB级别

    然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 这样字节的判断,然后 返回行 如果 到达 fbb的结尾 还没有结束,就再通过nio读取一段字节,继续处理。 由于对于本程序 116个字节以上的行...

    java nio 写文件

    java nio 写文件,java nio 写文件

    java nio 读文件

    java nio 读文件,java nio 读文件

    java NIO 写文件

    java nio 写文件样例,java写大数据文件时提高性能

    JavaNIO内存文件系统ParallelGit.zip

    ParallelGit 是为 Git 应用准备的高性能 Java NIO 内存文件系统。ParallelGit 是基于 JGit 构建的, 可以帮助 Java 项目快速的访问 Git 文件。ParallelGit 可以帮助你操作本地 Git仓库,允许你通过 Java 7 nio 文件...

    NIO(byteBuffer)按行读取文件

    使用nio byteBuffer 实现按行读取文件(大文件) 在window/linux/macOS上均测试通过 对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大...NIO API 是对 1.3 版 I/O 特性的补充而非取代,因此,何时使用新的 API,何时老的 1.3 版 I/O API 更适合特定应用,也是您将学习的内容。

    JAVA NIO 按行读取大文件支持 GB级别-修正版

    然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 这样字节的判断,然后 返回行 如果 到达 fbb的结尾 还没有结束,就再通过nio读取一段字节,继续处理。 由于对于本程序 116个字节以上的行才有意义...

    JAVA NIO 简单PFT 文件服务

    JAVA NIO 简单PFT 文件服务 上传 下载 列表

    NIO复制文件

    利用NIO中的类进行开发的文件复制实例,学习下类的使用

    尚硅谷Java视频_NIO 视频教程

    尚硅谷_NIO_通道的数据传输与内存映射文件 ·06. 尚硅谷_NIO_分散读取与聚集写入 ·07. 尚硅谷_NIO_字符集 Charset ·08. 尚硅谷_NIO_阻塞与非阻塞 ·09. 尚硅谷_NIO_阻塞式 ·10. 尚硅谷_NIO_非阻塞式 ·11. ...

    Java用NIO读取文件示范

    简单的用Java的NIO读取文件的程序,给大家参考。

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。...– 支持锁和内存映射文件的文件访问接口。 – 提供多路 (non-bloking) 非阻塞式的高伸缩性网络 I/O 。 本文档将围绕这几个特性进行学习和介绍。

    java NIO文件操作(中文版pdf)

    java NIO文件操作(中文版pdf),希望对大家有帮助,(转载)

    文件分割器(IO and NIO 两个版本)

    这是用java做的文件分割器,有两个版本,一个使用IO,另一个使用NIO,可以分割任意格式的文件。是在Linux下的eclipse中做的。

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    Java NIO 源码适合初学者,里面包括通道和Buffer的基本适用,以及文件锁,和内存文件映射等等

Global site tag (gtag.js) - Google Analytics