几种基于javaI/O的文件拷贝操作比较

最近公司的项目用到文件拷贝,由于涉及到的大量大文件的拷贝工作,代码性能问题显得尤为重要,所以写了以下例子对几种文件拷贝操作做一比较:

0、文件拷贝测试方法

 1 public static void fileCopy(String source, String target,int type) {
 2         Date start = new Date();
 3         File in = null;
 4         File out = null;
 5         FileInputStream fis = null;
 6         FileOutputStream fos = null;
 7         try {
 8             in = new File(source);
 9             out = new File(target);
10             switch (type) {
11             case 1:
12                 copyer1(in, out, fis, fos);
13                 break;
14             case 2:
15                 copyer2(in, out, fis, fos);
16                 break;
17             case 3:
18                 copyer3(in, out, fis, fos);
19                 break;
20             case 4:
21                 copyer4(in, out, fis, fos);
22                 break;
23             default:
24                 break;
25             }
26         } catch (Exception e) {
27             e.printStackTrace();
28         } finally {
29             if (fis != null) {
30                 try {
31                     fis.close();
32                 } catch (IOException e) {
33                     e.printStackTrace();
34                 }
35             }
36             if (fos != null) {
37                 try {
38                     fos.close();
39                 } catch (IOException e) {
40                     e.printStackTrace();
41                 }
42             }
43             Date end = new Date();
44             System.out.println("方法"+type+"用时:"+(end.getTime() - start.getTime())+" ms!");
45         }
46     }

方式一:一次读取全部数据

 1     /**
 2      * 一次全部读取文件内容
 3      */
 4     @SuppressWarnings("resource")
 5     public static void copyer1(File in,File out,FileInputStream fis,FileOutputStream fos) throws IOException{
 6         fis = new FileInputStream(in);
 7         int size = fis.available();
 8         byte[] buffer = new byte[size];
 9         fis.read(buffer);
10         fos = new FileOutputStream(out);
11         fos.write(buffer);
12         fos.flush();
13     }

方式二:每次读入固定字节的数据

 1     /**
 2      * 每次读取固定字节的数据
 3      */
 4     @SuppressWarnings("resource")
 5     public static void copyer2(File in,File out,FileInputStream fis,FileOutputStream fos) throws IOException{
 6
 7         fis = new FileInputStream(in);
 8         fos = new FileOutputStream(out);
 9         byte[] buffer = new byte[1024];
10         while (fis.read(buffer) != -1) {
11             fos.write(buffer);
12         }
13         fos.flush();
14     }

方式三:每次读取一行数据,适合按行解析数据的场景

 1     /**
 2      * 每次读取一行数据
 3      */
 4     @SuppressWarnings("resource")
 5     public static void copyer3(File in,File out,FileInputStream fis,FileOutputStream fos) throws IOException{
 6
 7         fis = new FileInputStream(in);
 8         fos = new FileOutputStream(out);
 9         BufferedReader br = new BufferedReader(new InputStreamReader(fis));
10         String line = null;
11         while ((line = br.readLine()) != null) {
12             fos.write(line.getBytes());
13         }
14         fos.flush();
15     }

方式四:每次读取一个字符,~_~,想想都累

 1     /**
 2      * 每次读取一个字节
 3      */
 4     @SuppressWarnings("resource")
 5     public static void copyer4(File in,File out,FileInputStream fis,FileOutputStream fos) throws IOException{
 6
 7         fis = new FileInputStream(in);
 8         fos = new FileOutputStream(out);
 9         int i = 0;
10         while ((i = fis.read()) != -1) {
11             fos.write(i);
12         }
13         fos.flush();
14     }
15 }

最后:测试用main函数

1     public static void main(String[] args) {
2         String source = "e:\\in.txt";
3         String target = "e:\\out.txt";
4         for (int i = 1; i < 5; i++) {
5             fileCopy(source, target, i);
6         }
7     }

测试文件:

运行结果:

时间: 2024-11-08 20:39:22

几种基于javaI/O的文件拷贝操作比较的相关文章

用python作个简单文件拷贝操作

http://blog.csdn.net/jeffreynicole/article/details/8271097

基于SFTP的文件拷贝软件

最近打算自己做几个软件,便于提升工作效率,并且可以恢复下码代码的能力.第一个软件就是基于SFTP的一个文件拷贝软件.目前可以拷贝选定远程服务器上的文件/文件夹内所有内容到本地目录.界面大致如下: 右边空白较大,因为还有些其他功能尚未完善. 软件主要有以下几个功能: 1. 用户选择想要连接的linux服务器名称(IP地址和密码软件内置,因为不想让用户看到) 2.连接到服务器后可显示根目录(内置)下所有文件及文件夹,忽略连接. 3.用户在左侧选中文件/文件夹后,在右侧配置本地目录,点击StartCo

一种基于二维码的半自动文件拷贝方法

在一种受限的环境中,要把文件拷贝出去显然是不可能的.因为既不能进行直接的文本拷贝(Ctrl+C, Ctrl+V),又不能使用scp(因为网络隔离).那么,真的一点办法都木有了吗?答案是否定的,因为毛主席说过,"卑贱者最聪明,高贵者最愚蠢".作为一个好琢磨的程序员,因为好奇("与天斗,其乐无穷:与地斗,其乐无穷:与人斗,其乐无穷."),所以很快想出了一个解决的办法,那就是利用非常盛行的二维码技术.虽然全自动拷贝不好实现,但半自动拷贝还是非常容易做到的.于是,本文尝试利

文件拷贝, 使用 BIO,NIO的对比,四种写法性能分析。

测试环境: jdk 1.7 +  2G内存 测试代码基本上复制了: http://blog.csdn.net/tabactivity/article/details/9317143 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

docker文件拷贝

向docker管理的"块"拷贝文件可以存在于三个时段(这里的块,可以指代镜像也可以指代运行实例.简单来说,即是docker管理的,程序员开发的,在容器中的东西) (1)镜像生成之前 (2)实例运行起来之后 实际操作 (1)镜像生成之前 即使用docker images 还不能查询到镜像时(一般是通过docker pull或docker build进行) (a)使用docker build命令可以通过编写Dockerfile,在其中使用COPY命令将指定目录下的文件.文件夹,组装容器.具

一种基于Qt的可伸缩的全异步C/S架构服务器实现(流浪小狗,六篇,附下载地址)

本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数目,从而在高传输负荷.高计算符合上达成取舍.数据处理采用流水线结构,以避免少量客户的密集计算请求影响其他客户端的处理.本文对应的代码符合LGPL协议,可直接从https://github.com/goldenhawking/zpserver下载. 也可从http://download.csdn.ne

一种基于Qt的可伸缩的全异步C/S架构服务器实现(一) 综述

本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数目,从而在高传输负荷.高计算符合上达成取舍.数据处理采用流水线结构,以避免少量客户的密集计算请求影响其他客户端的处理.本文对应的代码符合LGPL协议,可直接从https://github.com/goldenhawking/zpserver下载. 也可从http://download.csdn.ne

《连载 | 物联网框架ServerSuperIO教程》- 10持续传输大块数据流的两种方式(如:文件)

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架ServerSuperIO教程>2.服务实例的配置参数说明 <连载 | 物联网框架ServerSuperIO教程>- 3.设备驱动介绍 <连载 | 物联网框架ServerSuperIO教程>-4.如开发一套设备驱动,同时支持串口和网络通讯. <连载 | 物联网框架ServerSupe

arcgis 3种方法快速制作tpk文件(转)

arcgis 3种方法快速制作tpk文件(转) 作者:www.cnblogs.com  来源:www.cnblogs.com  发布日期:2015-03-22 来自:http://blog.csdn.net/arcgis_mobile/article/details/8048549 tpk是ArcGIS10.1推出的一种新的数据文件类型,主要是用于将切片文件打包形成离线地图包,tpk可以在ArcGIS Runtime或者ArcGIS for Android/iOS中作为切片底图被加载,有多种制作