先声明,速度慢的占用内存少;速度快的占用内存大。这是“以时间换空间”和"以空间换时间"的不同方式。
第一种:采用FileInputStream字节流的方式,
即: FileInputStream fis=new FileInputStream(“……”);Fis.read();
这种方式每次只获取一个字节的数据,而要复制的数据变大时,就要增加大量的循环次数,才可以把所有数据复制完,——速度是相当的慢,平时开发今本不用这种复制方式。
第二种:采用FileInputStream + byte[] 的方式,
及FileInputStream fis=new FileInputStream(“……”);
Byte[] b=new byte[1024];//一般情况下都是使用1024长度的 //数组
Fis.read(b);
这种方式,是将读取的数据先存储在字节数据中,然后再对数据进行输入,输出操作,大大降低了循环次数,并且往数组中存储数据是相对比较快的操作。
第三种
采用字符流缓冲区对象复制文件
即:BufferedInputStream+FileInputStream读取数据源
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(“……”));
Bis.read();
采用字符流缓冲区对象,是专门解决字节流读取写入数据慢的问题。
第四种:
及在第三种的方式上采用读取数据存入 byte[] 中。
写数据 和读数据一致。。。
下面是四种方法:及每种方法的复制速度比较。
- /*
- * 进行文件复制方法 及效率对比
- * 四种方式
- * 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("释放资源失败");
- }
- }
- }
- }
- }
希望对要学IO的有一丁点帮助。