本例使用FileChannel和 BufferedInputStream等测试对比。

TestHandler.java 用于实现动态代理,测试运行效率

package com.test;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class TestHandler implements InvocationHandler{private Object obj=null;public TestHandler(Object obj){this.obj=obj;}public static Object newInstance(Object obj){Object result=Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), new TestHandler(obj));return result;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object result=null;System.out.println("执行中...");long start=System.currentTimeMillis();result=method.invoke(obj, args);long end=System.currentTimeMillis();System.out.println("执行完成,耗时:"+(end-start));return result;}}

INIOTest.java

package com.test;import java.io.IOException;public interface INIOTest{public void copyFileMapped(String oldPath,String newPath)  throws IOException;public void copyFileNIO(String oldPath,String newPath)  throws IOException;public void copyFile(String oldPath,String newPath)  throws IOException;
}

Test.java

package com.test;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;public class Test implements INIOTest{public void copyFileMapped(String oldPath,String newPath)  throws IOException{long length=0;RandomAccessFile raf=new RandomAccessFile(oldPath , "r");FileChannel fcr=raf.getChannel();length=fcr.size();//返回要读取文件的映射内存区块MappedByteBuffer mbb=fcr.map(FileChannel.MapMode.READ_ONLY, 0, length);ByteBuffer buffer=mbb.get(new byte[(int)length]);//要写入的文件RandomAccessFile raw=new RandomAccessFile(newPath, "rw");FileChannel fcw=raw.getChannel();MappedByteBuffer mbbw=fcw.map(FileChannel.MapMode.READ_WRITE, 0, length);for(int i=0;i<length;i++){mbbw.put(i,buffer.get(i));}fcw.close();fcr.close();raf.close();raw.close();/*** MappedByteBuffer是java平台共享内存的实现,把硬盘虚拟为内存,* 主要用于进程间共享数据,所以在进程没有退出前文件是不允许删除的。 * 一个映射的字节缓冲区和文件映射,它代表仍然有效,直到缓冲本身是垃圾收集。*/raf=null;raw=null;System.gc();try {//等待垃圾回收Thread.sleep(100);} catch (InterruptedException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}public void copyFileNIO(String oldPath,String newPath) throws IOException{FileInputStream fis=new FileInputStream(oldPath);FileOutputStream fos=new FileOutputStream(newPath);   //获取输入输出通道FileChannel fcin=fis.getChannel();FileChannel fout=fos.getChannel();//创建缓冲区ByteBuffer buffer=ByteBuffer.allocate(1024);while(true){//clear方法重设缓冲区,使它可以接受读入的数据  buffer.clear();int len=fcin.read(buffer);if(len==-1){break;}//写模式转换成读模式。该限制设置为当前的位置然后位置设置为零。如果标记定义然后丢弃。//flip方法让缓冲区可以将新读入的数据写入另一个通道  buffer.flip();fout.write(buffer);}fcin.close();fout.close();}public void copyFile(String oldPath,String newPath) throws IOException{FileInputStream fis=new FileInputStream(oldPath);FileOutputStream fos=new FileOutputStream(newPath);BufferedInputStream bis=new BufferedInputStream(fis);BufferedOutputStream bos=new BufferedOutputStream(fos);byte[] buffer=new byte[1024];int len=0;while((len=bis.read(buffer))!=-1){bos.write(buffer,0,buffer.length);}bis.close();bos.close();}public static void main(String agrs[]){  INIOTest test1=(INIOTest)TestHandler.newInstance(new Test());try {test1.copyFileMapped("D:\\upan\\VC++6.0简体中文版.rar","D:\\VC++6.0简体中文版.rar");test1.copyFileNIO("D:\\upan\\VC++6.0简体中文版.rar","D:\\VC++6.0简体中文版.rar");test1.copyFile("D:\\upan\\VC++6.0简体中文版.rar","D:\\VC++6.0简体中文版.rar");           } catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}}

第一个为使用文件映射读写耗时

第二个为文件通道(Channel)读写文件耗时

第三个位BufferedInputStream等耗时

测试多次均是Channel,文件映射读写耗时较稳定,时间也比较短,BufferedInputStream时间也不错,和映射差不多(个人测试的是180M的文件,大文件建议还是使用文件映射可能好点)

特别需要注意的是文件映射无法关闭,MappedByteBuffer是java平台共享内存的实现,把硬盘虚拟为内存,主要用于进程间共享数据,所以在进程没有退出前文件是不允许删除的。也无法访问它。所以这里将它置为null,并等待垃圾回收它。

参考:http://yipsilon.iteye.com/blog/298153

JAVA NIO文件映射、通道、流读写文件示例相关推荐

  1. Java NIO之Channel(通道)

    **Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每节文章末尾有引用列表~ 写在所有文字的前面:作者在此特别推荐Google排名第一 ...

  2. Java NIO内存映射文件

    Java NIO 内存映射文件 文件操作的四大方法 效率对比 内存映射文件 缓冲区 缓冲区的获得: 文件加锁机制 文件锁使用注意点: 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基 ...

  3. Java学习第十六天——字符流读写文件、字符缓冲流拷贝文件

    字符流读写文件 字符流读数据-按单个字符读取 创建字符流读文件对象: ​ Reader reader = new FileReader("readme.txt"); 调用方法读取数 ...

  4. java字节流读取文件_字节流读取文件 java的几种IO流读取文件方式

    java字节流怎么读取数据 字节流读取数据例子如下: import java.io.File;import java.io.FileInputStream;import java.io.FileNot ...

  5. 第32天学习打卡(字符流读写文件,字节流读写文件)

    字符流读写文件 创建字符流读文件对象: BufferedReader br = new BufferedReader(new FileReader("readme.txt")); ...

  6. C# IO流读写文件操作

    C# IO流读写文件操作 1.创建文件流 2.创建文件读写器 3.执行读写操作 4.关闭文件读写器和文件流 1.创建文件流 string filePath = AppDomain.CurrentDom ...

  7. java 字符流读取_Java 字符流读写文件

    据说,java读写文件要写很多,贼麻烦,不像c艹,几行代码就搞定.只能抄抄模板拿来用了. 输入输出流分字节流和字符流.先看看字符流的操作,字节转化为字符也可读写. 一.写入文件 1.FileWrite ...

  8. Java.IO 字符流读写文件

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达! 一.序 上一篇我们谈了 java.IO 文件字节流读写操作(能懂系列Java.io文件字节流读写)大家应该都很熟悉了.但是中文和英文在字符 ...

  9. java io流读写文件换行_java基础io流——OutputStream和InputStream的故事(温故知新)...

    io流概述: IO流用来处理设备之间的数据传输,上传文件和下载文件,Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中. IO流分类 按照数据流向 输入流 读入数据 输出流 写出 ...

最新文章

  1. Linux Bash 笔记
  2. Mac下安装及使用rz、sz远程上传下载文件
  3. mysql 表资源,MySQL 复制表的方法
  4. 地址栏中的问号有什么作用
  5. python设计模式有哪些_设计模式教程
  6. JAVA怎么将整数反转_【leetcode刷题】[简单]7.反转整数(reverse integer)-java
  7. koa2 mysql 中间件_Koa2 和 Express 中间件对比
  8. linux查看接口的命令,linux shell命令查看接口索引--ip link show
  9. php无法禁用,security center无法禁用怎么办
  10. python 过采样算法_类不平衡数据分类准确率的提升算法smote过采样方法
  11. WM_SIZING 使用说明
  12. 桌面计算机快捷打不开,桌面快捷方式打不开怎么办【解决方法】
  13. WinEdt字体大小修改
  14. java文件编译后额外生成的$1.class是怎么一回事
  15. 史上最全的数据库面试题,面试前刷一刷!
  16. css绘制梯形图形,及显示矩形图片
  17. LC-3指令集 指令/状态码介绍
  18. AMD黑苹果 3A平台EFI分享给大家
  19. 【快速技巧】手机拍摄的视频如何旋转并保存?
  20. html snippets怎么配置,用Snippets创建自己喜欢的注释格式

热门文章

  1. 电脑无法使用typec耳机
  2. linux中etc目录的英文全称
  3. 分分钟解决OSPF配置问题
  4. 快速接入高德地图SDK(地图+定位+标记+路线规划+搜索)
  5. SolidWorks怎么开启RealView图形渲染功能
  6. 【矿渣】【玩客云】玩客云驱动OLED屏幕
  7. 晶联讯1353显示屏测试程序
  8. kubernetes进阶之路(十六)~~~Storage系列之StorageClass
  9. 无刷直流电机感应电动势为什么是梯形波?
  10. analyze怎么优化oracle,[转] Oracle analyze 命令分析