上篇博客将学习到的IO流部分知识进行了梳理,能让读者对期间涉及到的相关流有个大概认识,最后提到了“高效”的问题,口说无凭,下面拿代码验证下,有代码,有真相,重要的是将本文中想要叙述的细节问题全都写在了注释里边,让知识和代码离得更近,求好评!
package 课堂练习;
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、字节流 单个字节 257108ms 最慢的
* 2、字节流 字节数组 404ms (推荐使用)
* 3、字节流缓冲区 单个字节 1992ms
* 4、字节流缓冲区 字节数组 94ms (推荐使用) 最快的
*
* 用传参数的方式调用(src是源路径,desc是目标路径)
*/
public class Copy {
public static void main(String[] args) throws IOException {
//程序开始执行点
long s = System.currentTimeMillis();
//分别调用每一种测试方法:
//copy_1(new File("e:\\360cse.exe"), new File("f:\\360cse.exe"));
//copy_2(new File("e:\\360cse.exe"), new File("f:\\360cse.exe"));
//copy_3(new File("e:\\360cse.exe"), new File("f:\\360cse.exe"));
copy_4(new File("e:\\360cse.exe"), new File("f:\\360cse.exe"));
//程序结束执行点
long e = System.currentTimeMillis();
//计算程序运行完需要的时间(毫秒值)
System.out.println(e-s);
}
//方法一:字节流 单个字节
public static void copy_1(File src,File desc) throws IOException{
//建立两个流的对象,绑定数据源和数据目的
FileInputStream fis=new FileInputStream(src);
FileOutputStream fos=new FileOutputStream(desc);
//字节输入流每读取一个字节,输出流就写入一个字节
int len=0;
//不等于-1说明还有需要读取的字节
while((len=fis.read())!=-1){
fos.write(len);
}
//关流操作一般遵循的原则是:先开后关
fos.close();
fis.close();
}
//方法二:字节流 字节数组
public static void copy_2(File src,File desc)throws IOException{
FileInputStream fis=new FileInputStream(src);
FileOutputStream fos=new FileOutputStream(desc);
int len=0;
/*
* 用“字节数组”进行读取,和用“字节”读取相比,多了下面这句话,然后
* 读取的时候参数就成了3个,分别是定义的字节缓冲数组,0代表从读取的
* 第一个字节开始写入,和单个字节读取的方式相比不同的是len代表的含义
* 不通,字节读取的方式中,len代表的是字符对应的值,而此处用字节数组
* 的方式读取,len代表的是有效个数,请注意区分。 *
*/
byte[] bytes=new byte[1024];
while((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
}
//方法三: 字节流的缓冲区 单个字节
public static void copy_3(File src,File desc)throws IOException{
/*
* 创建字节输入流的缓冲流对象,构造方法中包装字节输入流,包装文件
* 可以传递任意的字节输入流FileInputStream,传递的是谁,就提高谁的效率
* 所以有了此代码,相信读者就可以理解我的上一篇博客中为何把缓冲流当成是“运载火箭”了
* 有了它,其他想提速的流就成了“流上之流”了。
*/
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();
}
//方法四:字节流的缓冲流 字节数组
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;
byte[] bytes =new byte[1024];
while((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
bos.close();
bis.close();
}
}