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流的读写速度,以便更加高效地完成任务。而且,以字节数组去读写,比用单个字节去读写,速度高出数百倍。在更加大型的数据量面前,优势更加明显。