Java文件快速copy复制实例代码
作者:Java劝退师、 发布时间:2021-05-27 12:25:22
标签:java,copy,复制
前言
最近学习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,否则更慢
结果
总结
来源:https://blog.csdn.net/qq_41389354/article/details/111932720
0
投稿
猜你喜欢
- 前言 因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果。本来没
- java 弹幕小游戏的最初版本,供大家参考,具体内容如下最近在学习javaSE,根据b站视频老师的讲解,也参考了他的代码,做了一个弹幕小游戏
- 使用foreach循环的坑我们首先看一段MyBatis中使用foreach循环的sql:SELECT * FROM table where
- 周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下。这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调
- 本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下先是效果图:主菜单:游戏:设置:错误处理:代码:#include
- 什么是文件上传?文件上传就是把用户的信息保存起来。为什么需要文件上传?在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。
- Springboot对配置文件的敏感信息加密前言最近公司对软件的安全问题比较在意,要求对配置文件中的敏感信息如数据库密码等进行加密。但是Sp
- springBoot是java开发中会经常用到的框架,那么在实际项目中项目配置了springBoot框架,应该如何在项目中读取配置文件中的参
- public void add(intindex, Eelement)从index索引的位置添加element元素,后面的元素都往
- Elastic Search是一个开源的,分布式,实时搜索和分析引擎。Spring Boot为Elasticsearch及Spring Da
- MultipartResolver和ServletFileUpload冲突如果同时使用了MultipartResolver 和Servlet
- 前言使用Java8的新特性Stream流式处理,可以提高对于集合的一些操作效率,再配合lambda表达式,可以极致的简化代码,尤其还有并行流
- 在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,通常使用@ResponseBody注解使 co
- 本文实例讲述了Spring实战之SpEl语法。分享给大家供大家参考,具体如下:一 Beanpackage org.crazyit.app.d
- 概念尽量使用合成/聚合,而不是使用继承实现复用。所谓的合成/聚合是指一个对象里持有另外一个类的对象,通过调用这些对象的方法得到复用已有功能的
- 1、数组理论基础数组是存放在连续内存空间上的相同类型数据的集合,可以通过下标索引的方式获取到下标下对应的数据。举个栗子(字符数组)~可以看到
- 本文实例为大家分享了springmvc实现验证码功能展示的具体代码,供大家参考,具体内容如下先看效果图: 思路: 首先验证码是一张图片,是一
- 本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下效果图:游戏介绍:1.2048是一款益智类小游戏,刚开始随
- java arrayList遍历的四种方法及Java中ArrayList类的用法package com.test;import java.u
- 一,描写叙述 在多线程下编程的时候。大家可能会遇到一种需求,就是我想在我开启的线程都结束时,同一时候获取