时间:2021-05-20
最近学习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流关闭方式不清楚的同学请看我这篇文章:
复制目标文件:
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,否则更慢
结果
到此这篇关于Java文件快速copy复制的文章就介绍到这了,更多相关Java文件快速copy复制内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了php不使用copy()函数复制文件的方法。分享给大家供大家参考。具体如下:下面的代码不使用php内置的copy函数,直接通过文件读取写入的操作方
先上源代码,你可以copy到自己的电脑上去运行~复制代码代码如下:多文件上传
这个例子很简单,直接上截图和代码。布局文件activity_copy.xml代码如下:后台CopyActivity.java代码如下:packagechengy
本文实例为大家分享了java将一个目录下的所有文件复制n次的具体代码,供大家参考,具体内容如下1.文件复制示意图2.java程序(1).调用finalstati
main.xml文件:复制代码代码如下:listview_item.xml文件:复制代码代码如下:MainActivity.java复制代码代码如下:packa