欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

Java文件快速copy复制实例代码

时间:2021-04-19 08:04:42|栏目:JAVA代码|点击:

前言

最近学习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.jb51.net/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,否则更慢

结果

总结

上一篇:聊聊Java 成员变量赋值和构造方法谁先执行的问题

栏    目:JAVA代码

下一篇:java单链表逆序用法代码示例

本文标题:Java文件快速copy复制实例代码

本文地址:http://www.codeinn.net/misctech/104046.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有