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文件的复制相关推荐

  1. Java中创建对象有哪几种方式,Java 中创建对象的4种方式--Java学习网

    核心提示:Java 是面向对象的语言,不可避免的,"对象"这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法. 总结下来有以下4种创建对象的 ...

  2. cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  3. 文件上传的三种方式-Java

    前言:负责,因为该项目他(jetty嵌入式开始SpringMvc)实现文件上传的必要性,并拥有java文件上传这一块还没有被曝光.并 Http 更多晦涩协议.因此,这种渐进的方式来学习和实践上载文件的 ...

  4. java中四种注入注解,Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  5. Java中实现接口的三种方式您造吗?

    本文介绍了Java中实现接口的三种方式:常规实现方式.匿名内部类和 Lambda表达式实现方式.希望已经了解的同学可以重新温习一下,不了解的同学则从中受益! Java中接口最常规的实现方式 同学们都会 ...

  6. java中实现多线程的三种方式

    java中实现多线程的三种方式 1.实现多线程的方法: 在java中实现多线程的两途径:继承Thread类,实现Runable接口(Callable) 2.继承Thread类实现多线程: ​ 继承类T ...

  7. Java中HashMap遍历的两种方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  8. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello {public stati ...

  9. java中Map遍历的四种方式

    java中Map遍历的四种方式 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方 ...

  10. java类初始数组_java中数组初始化的三种方式是什么

    java中数组初始化的三种方式是:1.静态初始化,如[int a[] = {2, 0, 1, 9, 2020}]:2.动态初始化,如[int[] c = new int[4]]:3.默认初始化,如[i ...

最新文章

  1. hbase查看表结构_HBase
  2. WMI-Win32_baseboard 主板参数
  3. AnalyticDB MySQL拥抱云原生,强力支撑双十一
  4. Jetty,Java和OAuth入门
  5. IntelliJ IDEA下的使用git
  6. 接口设计的几个注意事项
  7. 互联网和大数据是什么意思_互联网与大数据的区别是什么意思
  8. Alt属性 添加的意义
  9. python调用cmd执行命令_详解python调用cmd命令三种方法
  10. java在线订单系统源码_春哥酒店在线预订微信小程序源码系统正式发布!
  11. Flash Professional CS6 安装zxp插件
  12. Siamese-RPN论文阅读
  13. 【0226】信息安全与密码技术
  14. dcs常用的冗余方式_冗余技术在DCS平台应用分析
  15. 手机内存清理软件,让你的手机更轻更快!
  16. Novavax向美国提交新冠疫苗紧急使用授权申请;西门子医疗发布最新业绩 | 医药健闻...
  17. 泰森多边形(Voronoi图)生成算法
  18. 谈谈Android 6.0 的动态权限管理
  19. 原生JS实现富文本编辑器
  20. CSS设置高度等于动态的宽度

热门文章

  1. 设计新Xlator扩展GlusterFS[转]
  2. 常用代码整理(重要)
  3. thinkphp 创建子应用
  4. 字库点阵测试程序代码
  5. ESP8266-SDK编写的TM1668程序驱动数码管
  6. EOS 源代码解读 (2)插件-流程
  7. C++ Primer 5th笔记(3)字符串、向量和数组:数组
  8. optee3.8 qemu_v8的环境搭建篇(ubuntu20.04)
  9. [mmu/cache]-ARMV8的cache的维护指令介绍
  10. Golang经典面试题下