java直接调用复制文件,java中文件复制的4种方式,java文件的复制
java中文件复制的4种方式,java文件的复制
今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一些无效空间。我也是很少用这种方式拷贝问价,大多数用Apache提供的commons-io中的FileUtils,后来在网上查了下,发现还有其他的方式,效率更高,所以在此整理一下,也是自己的一个学习。
1. 使用FileStreams复制
比较经典的一个代码,使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。
2、使用FileChannel
Java NIO包括transferFrom方法,根据文档应该比文件流复制的速度更快。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import org.apache.commons.io.FileUtils;
public class CopyFilesExample {
public static void main(String[] args)throws InterruptedException,
IOException {
File source =new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile1.txt");
File dest =new File("C:\\Users\\nikos7\\Desktop\\files\\destfile1.txt");
// copy file using FileStreams
long start = System.nanoTime();
long end;
copyFileUsingFileStreams(source, dest);
System.out.println("Time taken by FileStreams Copy = "
+ (System.nanoTime() - start));
// copy files using java.nio.FileChannel
source =new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile2.txt");
dest =new File("C:\\Users\\nikos7\\Desktop\\files\\destfile2.txt");
start = System.nanoTime();
copyFileUsingFileChannels(source, dest);
end = System.nanoTime();
System.out.println("Time taken by FileChannels Copy = " + (end - start));
// copy file using Java 7 Files class
source =new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile3.txt");
dest =new File("C:\\Users\\nikos7\\Desktop\\files\\destfile3.txt");
start = System.nanoTime();
copyFileUsingJava7Files(source, dest);
end = System.nanoTime();
System.out.println("Time taken by Java7 Files Copy = " + (end - start));
// copy files using apache commons io
source =new File("C:\\Users\\nikos7\\Desktop\\files\\sourcefile4.txt");
dest =new File("C:\\Users\\nikos7\\Desktop\\files\\destfile4.txt");
start = System.nanoTime();
copyFileUsingApacheCommonsIO(source, dest);
end = System.nanoTime();
System.out.println("Time taken by Apache Commons IO Copy = "
+ (end - start));
}
private static void copyFileUsingFileStreams(File source, File dest)
throws IOException {
InputStream input =null;
OutputStream output =null;
try {
input =new FileInputStream(source);
output =new FileOutputStream(dest);
byte[] buf =new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buf)) >0) {
output.write(buf,0, bytesRead);
}
}finally {
input.close();
output.close();
}
}
private static void copyFileUsingFileChannels(File source, File dest)
throws IOException {
FileChannel inputChannel =null;
FileChannel outputChannel =null;
try {
inputChannel =new FileInputStream(source).getChannel();
outputChannel =new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel,0, inputChannel.size());
}finally {
inputChannel.close();
outputChannel.close();
}
}
private static void copyFileUsingJava7Files(File source, File dest)
throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
private static void copyFileUsingApacheCommonsIO(File source, File dest)
throws IOException {
FileUtils.copyFile(source, dest);
}
}
输出:
Time taken by FileStreams Copy =127572360
Time taken by FileChannels Copy =10449963
Time taken by Java7 Files Copy =10808333
Time taken by Apache Commons IO Copy =17971677
相关文章暂无相关文章
java直接调用复制文件,java中文件复制的4种方式,java文件的复制相关推荐
- Java中创建对象有哪几种方式,Java 中创建对象的4种方式--Java学习网
核心提示:Java 是面向对象的语言,不可避免的,"对象"这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的 ...
- cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...
本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...
- 文件上传的三种方式-Java
前言:负责,因为该项目他(jetty嵌入式开始SpringMvc)实现文件上传的必要性,并拥有java文件上传这一块还没有被曝光.并 Http 更多晦涩协议.因此,这种渐进的方式来学习和实践上载文件的 ...
- java中四种注入注解,Spring中依赖注入的四种方式
在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入 这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...
- Java中实现接口的三种方式您造吗?
本文介绍了Java中实现接口的三种方式:常规实现方式.匿名内部类和 Lambda表达式实现方式.希望已经了解的同学可以重新温习一下,不了解的同学则从中受益! Java中接口最常规的实现方式 同学们都会 ...
- java中实现多线程的三种方式
java中实现多线程的三种方式 1.实现多线程的方法: 在java中实现多线程的两途径:继承Thread类,实现Runable接口(Callable) 2.继承Thread类实现多线程: 继承类T ...
- Java中HashMap遍历的两种方式
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...
- JAVA中集合输出的四种方式
在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello {public stati ...
- java中Map遍历的四种方式
java中Map遍历的四种方式 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方 ...
- java类初始数组_java中数组初始化的三种方式是什么
java中数组初始化的三种方式是:1.静态初始化,如[int a[] = {2, 0, 1, 9, 2020}]:2.动态初始化,如[int[] c = new int[4]]:3.默认初始化,如[i ...
最新文章
- hbase查看表结构_HBase
- WMI-Win32_baseboard 主板参数
- AnalyticDB MySQL拥抱云原生,强力支撑双十一
- Jetty,Java和OAuth入门
- IntelliJ IDEA下的使用git
- 接口设计的几个注意事项
- 互联网和大数据是什么意思_互联网与大数据的区别是什么意思
- Alt属性 添加的意义
- python调用cmd执行命令_详解python调用cmd命令三种方法
- java在线订单系统源码_春哥酒店在线预订微信小程序源码系统正式发布!
- Flash Professional CS6 安装zxp插件
- Siamese-RPN论文阅读
- 【0226】信息安全与密码技术
- dcs常用的冗余方式_冗余技术在DCS平台应用分析
- 手机内存清理软件,让你的手机更轻更快!
- Novavax向美国提交新冠疫苗紧急使用授权申请;西门子医疗发布最新业绩 | 医药健闻...
- 泰森多边形(Voronoi图)生成算法
- 谈谈Android 6.0 的动态权限管理
- 原生JS实现富文本编辑器
- CSS设置高度等于动态的宽度