Java IO 文件的拷贝
几种方法的比较
- InputStream、OutputStream
- BufferedReader、BufferedWriter
- 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操作消耗很大,有缓冲区能够增加效率,适合文件的操作,即不用拿来看的,速度快,因为没有编码的操作,纯粹字节码。
注:欢迎大佬指点。