前言
最近学习netty的时候发现nio包下有个FileChannel类,经过了解这个类作用是个专门负责传输文件的通道,支持多线程,而且经过反复多次测试FileChannel复制文件的速度比BufferedInputStream/BufferedOutputStream复制文件的速度快了近三分之一。在复制大文件的时候更加体现出FileChannel的速度优势。而且FileChannel是多并发线程安全的。代码也比较简洁
代码贴下
package com.niu.nio; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel; /** * @description: * @author: nxq email: niuxiangqian163@163.com * @createDate: 2020/12/28 5:48 下午 * @updateUser: nxq email: niuxiangqian163@163.com * @updateDate: 2020/12/28 5:48 下午 * @updateRemark: * @version: 1.0 **/ public class Main { public static void main(String[] args) { quickCopy(new File("/Users/laoniu/a.txt"),new File("/Users/laoniu/b.txt")); } /** * 快速copy * @author nxq * @param src: 源文件 * @param target: 目标文件 * @return void */ public static void quickCopy(File src, File target){ try(FileInputStream inputStream = new FileInputStream(src); FileOutputStream outputStream = new FileOutputStream(target); FileChannel inputChannel = inputStream.getChannel(); // 得到源文件通道 FileChannel outputChannel = outputStream.getChannel()// 得到目标文件通道 ) { //将源文件数据通达连通到目标文件通道进行传输 inputChannel.transferTo(0,inputChannel.size(),outputChannel); }catch (Exception e){ e.printStackTrace(); } } }
关于这种io流关闭方式不清楚的同学请看我这篇文章:https://www.freexyz.cn/article/203438.htm
测试对比
复制目标文件:
4.76GB
代码
package com.niu.nio; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel; /** * @description: * @author: nxq email: niuxiangqian163@163.com * @createDate: 2020/12/28 5:48 下午 * @updateUser: nxq email: niuxiangqian163@163.com * @updateDate: 2020/12/28 5:48 下午 * @updateRemark: * @version: 1.0 **/ public class Main { public static void main(String[] args) { long start = System.currentTimeMillis(); File src = new File("/Users/laoniu/Downloads/installer/cn_windows_10_business_edition_version_1809_updated_sept_2018_x64_dvd_fc5542c0.iso"); //文件4.76GB quickCopy(src,new File("/Users/laoniu/test/a.iso")); long end = System.currentTimeMillis(); System.out.println("FileChannel复制:"+(end - start)); start = System.currentTimeMillis(); copy(src,new File("/Users/laoniu/test/b.iso")); end = System.currentTimeMillis(); System.out.println("普通复制:"+(end - start)); } /** * 快速copy * @author nxq * @param src: 源文件 * @param target: 目标文件 * @return void */ public static void quickCopy(File src, File target){ try(FileInputStream inputStream = new FileInputStream(src); FileOutputStream outputStream = new FileOutputStream(target); FileChannel inputChannel = inputStream.getChannel(); // 得到源文件文件通道 FileChannel outputChannel = outputStream.getChannel()// 得到目标文件通道 ) { //将源文件数据通达连通到目标文件通道进行传输 inputChannel.transferTo(0,inputChannel.size(),outputChannel); }catch (Exception e){ e.printStackTrace(); } } /** * 普通copy * @author nxq * @param src: * @param target: * @return void */ public static void copy(File src, File target){ try(FileInputStream inputStream = new FileInputStream(src); FileOutputStream outputStream = new FileOutputStream(target); ) { byte[] data = new byte[1024*1024]; //加大每次读取的数据多少 int len; while ((len = inputStream.read(data))!=-1){ outputStream.write(data,0,len); } }catch (Exception e){ e.printStackTrace(); } } }
加大每次读取的数据到1024*1024,否则更慢
结果
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)