gistfile1.txt
/*
* 进行文件复制方法 及效率对比
* 四种方式
* 1. 字节流读写单个字节 135095
* 2. 字节流读写字节数组 208 推荐
* 3. 缓冲区读写单个字节 1187
* 4. 缓冲区读写字节数组 90 强烈推荐
* 我们复制一个25M大小的视屏文件1.avi
* 数据源: c:\\1.avi
* 数据目的: d:\\1.avi
*
* 自己的复制功能,比固体要快,比Windows也要快
* 为什么:
* 流底层也是找Windows读写
* 固态中,复制文件,依赖Windows
* 复制,实现很多功能:
* 目的,够不够装文件
* 判断用户有没有复制权限,粘贴权限
*
*/
import java.io.*;
public class CopyFile_Test {
public static void main(String[] args) {
// 测试效率,采用毫秒值计算
long start = System.currentTimeMillis();
copy_4();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
/*
* 4. 缓冲区读写字节数组
*/
public static void copy_4(){
// 创建2个缓冲区流的变量,=null
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
// 创建字节流缓冲区对象,传递字节流
bis = new BufferedInputStream(
new FileInputStream("c:\\m.exe"));
// 创建字节输出流缓冲区对象,传递字节输出流
bos = new BufferedOutputStream(
new FileOutputStream("d:\\m.exe"));
// 读写字节数组
/*
*当数组长度,在一定范围内长度更大的时候,复制速度会更快,
*但如果过长,系统在为bytes分配数组的时间就会很长,反而降低了复 *制速度.所以不能使用太长的数组.
*/
byte[] bytes = new byte[1024];
int len = 0;
while ((len = bis.read(bytes)) != -1) {
bos.write(bytes,0,len);
}
} catch (IOException ex) {
throw new RuntimeException("文件复制失败");
} finally {
MyCloseStream.close(bis, bos);
}
}
/*
* 3. 缓冲区读写单个字节
*/
public static void copy_3() {
// 创建2个缓冲区流的变量,=null
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
// 创建字节流缓冲区对象,传递字节流
bis = new BufferedInputStream(
new FileInputStream("c:\\1.avi"));
// 创建字节输出流缓冲区对象,传递字节输出流
bos = new BufferedOutputStream(
new FileOutputStream("d:\\1.avi"));
// 读写单个字节
int len = 0;
while ((len = bis.read()) != -1) {
bos.write(len);
}
} catch (IOException ex) {
throw new RuntimeException("文件复制失败");
} finally {
MyCloseStream.close(bis, bos);
}
}
/*
* 2. 字节流读写字节数组
*/
public static void copy_2() {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("c:\\1.avi");
fos = new FileOutputStream("d:\\1.avi");
// 定义字节数组,长度1024整数倍
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fis.read(bytes)) != -1) {
// fos流写字节数组
fos.write(bytes, 0, len);
}
} catch (IOException ex) {
ex.printStackTrace();
throw new RuntimeException("复制失败");
} finally {
// 调用工具类close方法
MyCloseStream.close(fis, fos);
}
}
/*
* 1. 字节流读写单个字节
*/
public static void copy_1() {
// 声明2个流对象,=null
FileInputStream fis = null;
FileOutputStream fos = null;
try {
// 创建2个流对象,new
fis = new FileInputStream("c:\\1.avi");
fos = new FileOutputStream("d:\\1.avi");
// fis读取1个字节,fos写1个字节
int len = 0;
while ((len = fis.read()) != -1) {
fos.write(len);
}
} catch (IOException ex) {
ex.printStackTrace();
throw new RuntimeException("复制失败");
} finally {
MyCloseStream.close(fis, fos);
}
}
}
MyCloseStream.java
/* 关闭方法close的细节
* 单独的close方法,定义一套自己的try catch处理
* 保证所有的close都会执行到
*/
import java.io.*;
public class CopyFile {
public static void main(String[] args) {
//声明2个流对象,=null
FileInputStream fis = null;
FileOutputStream fos = null;
try{
//创建2个流对象,new
fis = new FileInputStream("c:\\t.jpg");
fos = new FileOutputStream("d:\\t.jpg");
//fis读取1个字节,fos写1个字节
int len = 0 ;
while((len = fis.read())!=-1){
fos.write(len);
}
}catch(IOException ex){
ex.printStackTrace();
throw new RuntimeException("复制失败");
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}finally{
try{
if(fis!=null)
fis.close();
}catch(IOException ex){
throw new RuntimeException("释放资源失败");
}
}
}
}
}