原文转载自:https://blog.csdn.net/qq_41805361/article/details/101274057
JAVA中文件复制的高效代码实现
** 这篇博客,讨论的是java中IO流部分的文件复制。其中涉及到字节流,以及字节缓冲区流,给出了四种文件复制的方式,以及java源代码。最后根据完成文件复制任务所需要的时间,得到最高效的文件复制方式。
##任务目标
通过java开发软件Eclipse编程实现电脑硬盘中的一个QQ应用程序文件**F:\QQ\PCQQ2019.exe(共82958368字节,约为79.1MB)**到D盘根目录D:\QQ.exe下的一个文件复制。
##文件复制的方法
文件复制的四种方式:
1:利用字节流读写单个字节的方式完成文件复制。
2:利用字节流读写字节数组的方式完成文件复制。
3:利用字节流缓冲区流读写单个字节的方式完成文件复制。
4:利用字节流缓冲区流读写字节数组的方式完成文件复制。
代码实现:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 文件复制方式,字节流,一共4个方式
* 1. 字节流读写单个字节 copy_1方法使用时间622357毫秒(约为10.3分钟)
* 2. 字节流读写字节数组 copy_2方法使用时间953毫秒(0.953秒)
* 3. 字节流缓冲区流读写单个字节 copy_3方法使用时间4781毫秒(4.781秒)
* 4. 字节流缓冲区流读写字节数组 copy_4方法使用时间250毫秒(0.25秒)
*/
public class Copy {
public static void main(String[] args)throws IOException {
//计算一下程序运行前的当前时间毫秒值,利用System类的currentTimeMillis()方法
long s = System.currentTimeMillis();
//调用方法
//参数1:原文件,参数2:复制的文件
// copy_1(new File("C:\\Users\\zhangsan\\Desktop\\user.txt"), new File("C:\\Users\\v\\Desktop\\user1.txt"));
// copy_2(new File("C:\\Users\\zhangsan\\Desktop\\user.txt"), new File("C:\\Users\\zhangsan\\Desktop\\user1.txt"));
// copy_3(new File("C:\\Users\\zhangsan\\Desktop\\user.txt"), new File("C:\\Users\\zhangsan\\Desktop\\user1.txt"));
copy_4(new File("C:\\Users\\zhangsan\\Desktop\\user.txt"), new File("C:\\Users\\zhangsan\\Desktop\\user1.txt"));
//计算一下程序运行完后的当前时间毫秒值,利用System类的currentTimeMillis()方法
long e = System.currentTimeMillis();
//前后毫秒值进行作差,计算出该方法(当前为方法copy_1在运行,剩余的三种方法均被注释)完成文件复制所需要的时间。并打印在控制台。
System.out.println(e-s);
}
/*
* 方法,实现文件复制
* 4. 字节流缓冲区流读写字节数组
*/
public static void copy_4(File src,File desc)throws IOException{
//创建输入字节流缓冲区流对象,并在构造方法中绑定数据源。
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
//创建输出字节流缓冲区流对象,并在构造方法中绑定数据目的。
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desc));
int len = 0 ;
//定义一个字节数组,长度为1024
byte[] bytes = new byte[1024];
//用输入字节流缓冲区流对象读取文件,用输出字节流缓冲区流对象写入文件
while((len = bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
//关闭流资源
bos.close();
bis.close();
}
/*
* 方法,实现文件复制
* 3. 字节流缓冲区流读写单个字节
*/
public static void copy_3(File src,File desc)throws IOException{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desc));
int len = 0 ;
//以单个字节的方式进行读取写入
while((len = bis.read())!=-1){
bos.write(len);
}
bos.close();
bis.close();
}
/*
* 方法,实现文件复制
* 2. 字节流读写字节数组
*/
public static void copy_2(File src,File desc)throws IOException{
//创建文件字节输入流对象,绑定数据源。
FileInputStream fis = new FileInputStream(src);
//创建文件输出字节流对象,绑定数据目的。
FileOutputStream fos = new FileOutputStream(desc);
int len = 0 ;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
}
/*
* 方法,实现文件复制
* 1. 字节流读写单个字节
*/
public static void copy_1(File src,File desc)throws IOException{
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(desc);
int len = 0 ;
while((len = fis.read())!=-1){
fos.write(len);
}
fos.close();
fis.close();
}
}
##代码分析
以上便是,文件复制四种方法的java源码,对程序的各个部分都进行了注释标注,该源代码可以在Eclipse下运行。并且在代码的开始部分对四种方法的运行性能已经作了结果展示。即如下:
文件复制方式,字节流,一共4个方式:
1.字节流读写单个字节copy_1方法使用时间622357毫秒(约为10.3分钟)
2.字节流读写字节数组 copy_2方法使用时间953毫秒(0.953秒)
3.字节流缓冲区流读写单个字节 copy_3方法使用时间4781毫秒(4.781秒)
4. 字节流缓冲区流读写字节数组copy_4方法使用时间250毫秒(0.25秒)
##总结分析
对以上数据分析可以得到,同样的文件复制数据量,方法2与方法4性能好,性能最好的是方法4。字节流缓冲区流是java中的一大类,专门用来提高IO流的读写速度,以便更加高效地完成任务。而且,以字节数组去读写,比用单个字节去读写,速度高出数百倍。在更加大型的数据量面前,优势更加明显。