Java IO 拷贝文件比较
来源:互联网 发布:学中文的软件 编辑:程序博客网 时间:2024/05/16 14:51
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操作消耗很大,有缓冲区能够增加效率,适合文件的操作,即不用拿来看的,速度快,因为没有编码的操作,纯粹字节码。
注:欢迎大佬指点。
此外推荐一种最快复制文件方式:
http://www.cnblogs.com/interdrp/p/3523456.html
0 0
- Java IO 拷贝文件比较
- Java Io 之拷贝文件性能比较
- Java---IO文件拷贝
- java io流之拷贝文件
- java.se.io.3.文件拷贝
- JAVA-IO 文件拷贝功能的实现
- JAVA IO流十种拷贝文件例子
- java io 文件的拷贝2
- JAVA-IO流大文件拷贝
- java io 拷贝文件 复制文件夹
- Java IO与NIO实现文件拷贝
- java io流之拷贝文件
- java IO实现文件拷贝以及文件夹拷贝
- io拷贝文件
- IO实现文件拷贝
- io流-文件拷贝
- io文件拷贝
- java.io 递归拷贝
- 蓝桥杯 算法提高 学霸的迷宫(bfs+方向输出)
- MySQL 学习<一> MySQL简介
- MySql数据库索引原理
- Hibernate逆向工程An internal error occurred during: "Generating Artifacts". java.lang.NullPointerExcepti
- ZOJ 3953 Intervals(区间贪心)
- Java IO 拷贝文件比较
- DB2,Oracle,SQL server,Mysql分页查询语句
- HTML5学习笔记 —— JavaScript基础知识
- 汇编-识别条件分歧
- Properties
- 欢迎使用CSDN-markdown编辑器
- java.lang.IllegalArgumentException: No config chosen错误
- 排序算法
- 消息中间件-activemq实战之消息持久化(六)