Java IO 拷贝文件比较

时间:2021-06-01 21:36:57

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));

}

}

想要复制的文件
Java IO 拷贝文件比较
运行结果:
Java IO 拷贝文件比较
多运行几次基本是1 或2毫秒
Java IO 拷贝文件比较

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

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

此时的运行结果:
Java IO 拷贝文件比较

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

二、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毫秒左右
Java IO 拷贝文件比较

三、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毫秒左右
Java IO 拷贝文件比较

在API中,如图所示:
Java IO 拷贝文件比较
Java IO 拷贝文件比较

总结:

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

注:欢迎大佬指点。

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

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