最近学习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://laoniu.blog.csdn.net/article/details/111896446

测试对比

复制目标文件:

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.76GBquickCopy(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复制相关推荐

  1. 如何将计算机网络文件夹复制到,如何将大文件快速拷贝/复制/分享到另一台电脑?...

    如何将大文件快速拷贝/复制/分享到另一台电脑?相信这是很多朋友都想知道是如何做到的吧.因为我们平时可以因为各种原因,如电脑格盘重装.高清电影分享.更换电脑等),需要将大文件拷贝至另一台电脑.那该怎么办 ...

  2. 如何将桌面文件夹移到计算机,如何将大文件快速拷贝/复制/分享到另一台电脑?...

    如何将大文件快速拷贝/复制/分享到另一台电脑?相信这是很多朋友都想知道是如何做到的,因为平时可以因为各种原因,如电脑格盘重装.高清电影分享.更换电脑等),需要将大文件拷贝至另一台电脑.那该怎么办呢? ...

  3. java文件快速扫描仪_Java扫描仪具有示例的NextNextShort()方法

    扫描仪类hasNextShort()方法 语法:public boolean hasNextShort(); public boolean hasNextShort(int rad);hasNextS ...

  4. java文件快速扫描仪_java扫描仪上传文件

    问题: 项目中有一个功能,原来是用ckfinder做的,可以选择本地图片上传至服务器,然后将服务器的图片显示在浏览器中,并可以将图片地址保存到数据库:现在客户觉得麻烦,提出连接扫描仪扫描后直接上传至服 ...

  5. java文件快速扫描仪_Java使用扫描仪进入按键

    这可以使用java.util.Scanner进行,并且会执行多次"输入"击键: Scanner scanner = new Scanner(System.in); String r ...

  6. java文件快速扫描仪_有没有办法从Java中的方法提供自动扫描仪输入?

    我正在创建一个带有矩阵加法,标量乘法,获得转置等的小型线性代数库,其构造函数将所需矩阵的尺寸作为参数. 我们的想法是能够在创建对象时使用随机元素或用户指定的元素返回给定大小的矩阵,并且我使用Scann ...

  7. JDK环境下利用记事本对java文件进行运行编译

    在电脑上只安装了JDK,而没有安装IDEA的情况下也是照样可以对java文件进行编译.第一步我们先要新建一个文本,这里以C盘为例:首先在C盘的某一个文件夹中写一个文本文件,把后缀改写成java(文本内 ...

  8. copy所有的java文件到硬盘_将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad...

    listFiles方法接受一个FileFilter对象,这个FileFilter对象就是过虑的策略对象,不同的人提供不同的FileFilter实现,即提供了不同的过滤策略. //将d:\java目录下 ...

  9. java nio copy_使用NIO快速复制Java文件

    package com.test.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutpu ...

  10. 将test1文件下的.java文件复制到copy文件下

    import java.io.*;public class CopyTest {public static void main(String[] args) throws IOException{Fi ...

最新文章

  1. vue 源码学习(二) 实例初始化和挂载过程
  2. Win2008 R2实战之只读域控制器部署(图)
  3. 数组中存储不定个数的元素
  4. 数据结构 - 红黑树
  5. LoRaWAN的四大优势及适用领域
  6. 1.3编程基础之算术表达式与顺序执行 03 计算(a+b) c的值
  7. 在java中班级的表示方法_Java基础班学习笔记(8)
  8. linux-3.5.4内核添加新的系统调用并测试!!!!!
  9. 由浅入深解释JS执行机制 EventLoop
  10. 【渗透测试实战】PHP语言有哪些后门?以及利用方法
  11. ActiveReports 报表应用教程 (9)---交互式报表之动态排序
  12. 计算机专业计算机 等级怎样填,计算机水平一般怎么填
  13. 译: 6. 任务调度(定时执行任务)
  14. 如何访问嵌套母版页中的控件
  15. 那四年,我们一起逝去的青春
  16. API安全风险与防范
  17. 条件期望与全期望公式
  18. 【PPT】连续使用箭头等工具,避免多次重复选择,提升效率
  19. 基于Python+djangoWeb的校园信息化统计平台
  20. Scroller简单介绍

热门文章

  1. 最新亲测可用的免费google翻译api
  2. windows系统安装下GCC编译器
  3. Jave基本知识(一)
  4. 某度文库付费文档下载,实测可用~
  5. GD32F103读写内部FLASH
  6. 盒子模型及层模型【定位】
  7. E-R图练习(邮件客户端系统)
  8. 通信原理基础知识概括
  9. android webview 无法加载插件,webView 测试问题,无法检测到 webView 控件
  10. android 自动校准时间,Android客户端怎么同步校准服务器上的时间