Java IO 拷贝文件比较

Java IO 文件的拷贝

几种方法的比较

  1. InputStream、OutputStream
  2. BufferedReader、BufferedWriter
  3. Reader、Writer

一、InputStream、OutputStream

package File;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;

public class FileCopy {

    public FileCopy() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
     //System.out.println(args[0]);
        long  startTime=System.currentTimeMillis();
        //File inFile=new File(args[0]); //源文件路径
        File file=new File("D:"+File.separator+"File"+File.separator+"java.txt"); //File.separate 等于// \\ 为了兼容系统,详见API
        File copyFile=new File("D:"+File.separator+"File"+File.separator+"javacopy.txt");
        if(!file.exists())
        {
            System.out.println("源文件不存在~!");
            System.exit(1);  //退出
        }
        //File outfile=new File(args[1]);
        if(!copyFile.getParentFile().exists())
        {
            copyFile.getParentFile().mkdir(); //创建路径
        }
        InputStream input=new FileInputStream(file); //输入流
        OutputStream output=new FileOutputStream(copyFile); //输出流
        int temp=0;
        byte data[]=new byte[1024]; //每次读取的字节数
        while((temp=input.read(data))!=-1) //接收内容
        {
            output.write(data,0,temp); //输出内容
        }

        /*while((temp=input.read())!=-1) //接收内容
        {
            output.write(temp); //输出内容
        }*/
        input.close();
        output.close();
        long endTime=System.currentTimeMillis();
        System.out.println("消耗时间为:"+(endTime-startTime));

    }

}

想要复制的文件
想要复制的文件
运行结果:
这里写图片描述
多运行几次基本是1 或2毫秒
这里写图片描述

这里我们修改下读写时候的代码,即被注释的代码:

while((temp=input.read())!=-1) //接收内容
        {
            output.write(temp); //输出内容
        }

此时的运行结果:
这里写图片描述

突然就变大了,效率也不一样了。

二、BufferedReader、BufferedWriter

package File;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopy2 {

    public FileCopy2() {
        // TODO Auto-generated constructor stub
    }
    public static void main(String []args) throws IOException{
        long startTime=System.currentTimeMillis();
        File file=new File("D:"+File.separator+"File"+File.separator+"java.txt"); //File.separate 等于// \\ 为了兼容系统,详见API
        File copyFile=new File("D:"+File.separator+"File"+File.separator+"javacopy2.txt");
        if(!file.exists()) //不存在文件
        {
            file.createNewFile();
        }
        if(!file.getParentFile().exists())//不存在目录
        {
            file.getParentFile().mkdirs();
        }
        FileReader fileReader=new FileReader(file);
        BufferedReader bufferedReader=new BufferedReader(fileReader);
        FileWriter fileWriter=new FileWriter(copyFile);
        BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);

        String string=null;
        while((string=bufferedReader.readLine())!=null){
            bufferedWriter.write(string);

        }
        bufferedReader.close(); //先关闭buffer这个高级流
        fileReader.close();
        bufferedWriter.close();
        fileWriter.close();
        long endTime=System.currentTimeMillis();
        System.out.println("消耗时间为:"+(endTime-startTime));

    }

}

运行结果:基本维持在7毫秒左右
这里写图片描述

三、Reader、Writer

package File;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

public class FileCopy3 {

    public FileCopy3() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        long startTime=System.currentTimeMillis(); //开始时间
      File file=new File("D:"+File.separator+"File"+File.separator+"java.txt");
      File copyFile=new File("D:"+File.separator+"File"+File.separator+"javacopy3.txt");
      if(!file.exists()) //文件不存在
      {
          file.createNewFile();
      }
      if(!file.getParentFile().exists()) //目录不存在
      {
          file.getParentFile().mkdirs();
      }

      Reader reader=new FileReader(file);
      Writer writer=new FileWriter(copyFile);
       int length=(int) file.length(); //文件大小
      char c[]=new char[length]; //最长读取长度

      int len=reader.read(c);
      String string= String.valueOf(c, 0, len);
      //System.out.println(string);
      writer.write(string);

      reader.close();
      writer.close();
      long endTime=System.currentTimeMillis();
      System.out.println("消耗时间为:"+(endTime-startTime));//结束时间
    }

}

运行结果:基本维持在5毫秒左右
这里写图片描述

在API中,如图所示:
这里写图片描述
这里写图片描述

总结:

1.不难看出,如果字节流没有缓冲区很慢,但是加了缓冲区是这几种最快的。
2.减少对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
3.由于此次只测试了纯字符文件。字节数组文件复制(FileInputStreams,FileOutputStreams),适合文件的操作,即不用拿来看的,速度快,因为没有编码的操作,纯粹字节码。
4.高效单字节文件复制(BufferedInputStreams,BufferedOutputStreams),增加了缓冲区,减少多次IO操作,IO操作消耗很大,有缓冲区能够增加效率,适合文件的操作,即不用拿来看的,速度快,因为没有编码的操作,纯粹字节码。

注:欢迎大佬指点。

此外推荐一种最快复制文件方式:

http://www.cnblogs.com/interdrp/p/3523456.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离水的鱼儿

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值