package com.cskaoyan.io01.efficiency;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author zhangshuai@Cskaoyan.onaliyun.com on
* @version 1.0
*
* 比较四种复制方式的效率
*
* 1. 不使用缓冲流
* a. 一次复制一个字节数据
* b. 一次复制一个字节数组的数据
*
* 2. 使用缓冲流
* a. 一次复制一个字节数据
* b. 一次复制一个字节数组的数据
*
*
* copyByte: 48902
* copyByteInBuf: 411
copyBytes: 40
copyBytesInBuf: 18
*
*
*
*/
public class Comparison {
public static void main(String[] args) throws IOException {
File src = new File("e:\\copy\\vedio.mp4");
File dest1 = new File("e:\\copy-vedio1.mp4");
File dest2 = new File("e:\\copy-vedio2.mp4");
File dest3 = new File("e:\\copy-vedio3.mp4");
File dest4 = new File("e:\\copy-vedio4.mp4");
//不用缓冲流,一次复制一个字节
copyByte(src, dest1);
//使用缓冲流,一次复制一个字节
//copyByteInBuf(src, dest2);
//不使用缓冲流,一次复制一个字节数组数据
//copyBytes(src, dest3);
//使用缓冲流,一次复制一个字节数组数据
//copyBytesInBuf(src, dest4);
}
/**
* 一次读写一个字节
*/
public static void copyByte(File srcFile, File destFile) throws IOException {
//创建输入流对象
FileInputStream fis = new FileInputStream(srcFile);
//创建输出流对象
FileOutputStream fos = new FileOutputStream(destFile);
int readByte;
//记录当前时间的毫秒值
long start = System.currentTimeMillis();
//开始一个字节一个字节的复制
while ((readByte = fis.read()) != -1) {
fos.write(readByte);
}
//记录复制完成之后的一个时间的毫秒值
long end = System.currentTimeMillis();
System.out.println("copyByte: " + (end - start));
fis.close();
fos.close();
}
/**
* 一次读写一个字节 但是用的是缓冲流
*/
public static void copyByteInBuf(File srcFile, File destFile) throws IOException {
//创建输入流对象
FileInputStream fis = new FileInputStream(srcFile);
BufferedInputStream bis = new BufferedInputStream(fis);
//创建输出流对象
FileOutputStream fos = new FileOutputStream(destFile);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int readByte;
//开始一个字节一个字节的复制
long start = System.currentTimeMillis();
while ((readByte = bis.read()) != -1) {
bos.write(readByte);
}
long end = System.currentTimeMillis();
System.out.println("copyByteInBuf: " + (end - start));
bis.close();
bos.close();
}
/**
* 一次读写一个字节数组
*/
public static void copyBytes(File srcFile, File destFile) throws IOException {
//创建输入流对象
FileInputStream fis = new FileInputStream(srcFile);
//创建输出流对象
FileOutputStream fos = new FileOutputStream(destFile);
int len;
byte[] buffer = new byte[2048];
long start = System.currentTimeMillis();
//开始一个字节一个字节的复制
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
long end = System.currentTimeMillis();
System.out.println("copyBytes: " + (end - start));
fis.close();
fos.close();
}
/**
* 一次读写一个字节数组,用缓冲流
*/
public static void copyBytesInBuf(File srcFile, File destFile) throws IOException {
//创建输入流对象
FileInputStream fis = new FileInputStream(srcFile);
BufferedInputStream bis = new BufferedInputStream(fis);
//创建输出流对象
FileOutputStream fos = new FileOutputStream(destFile);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int len;
byte[] buffer = new byte[2048];
long start = System.currentTimeMillis();
//开始一个字节一个字节的复制
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
long end = System.currentTimeMillis();
System.out.println("copyBytesInBuf: " + (end - start));
bis.close();
bos.close();
}
}