Java IO 拷贝文件比较

来源:互联网 发布:学中文的软件 编辑:程序博客网 时间:2024/05/16 14:51

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
原创粉丝点击