文件复制总结
开篇废话:
最近渐渐习惯了蓝杰的学习,有点渐入佳境的感觉(仅是个人感觉),但是总的进度还是略有落后,安卓还没开始,还停留在刚刚构建好的层面,虽然听了两节课,但说实话没什么感觉,可能是没有练习的缘故。,写完这篇就开始搞之。最近还发现自己一个问题,在代码中会犯一些粗心的错误,而这些错误在找的时候又不那么容易,所以以后还要谨慎些。总的来说我这个阶段过的还OK。学习再继续…大家一起努力…在某求职节目看到这么一句话拿来与大家共勉(“我走的很慢,但我从未停下前进的脚步”)…
谈文件复制思想:首先我们的程序先要获取要复制文件的文本内容,然后再将传入的内容通过程序传出到另一个我们新创建文件中,大的思想是这样的。但在具体实现过程中还有一些小的细节。
谈实现:
1)实现“程序先要获取要复制文件的文本内容”
在实现这个功能时我们用到InputStream这个抽象类的实现类FileInputStream,在创建了这个实现类的对象以后我们会用到read()方法这样我们就可以获取到目标文件的内容
2)实现“将传入的内容通过程序传出到另一个我们新创建文件中”
在实现这个功能时我们会用到OutputStream这个抽象类的实现类FileOutputStream,这个实现类同样会有三个write方法与read所对应,理论上这样我们就可以完成这个功能。
谈优化:
在read和write之间我们面临个选择:
1)我们一次性将文件读完并保存在临时数组中,然后将数组整体传
2)我们按字节读一个字节传一次
3)我们每次读一定大小的文件然后传,然后循环这个过程直至传完为止
分析:
理论上这三种方法都是行的通的我们可以分析一下哪个更好。
第一种方法如果在文件不大时,当然是很好,用的时间也少,但是当文件很大时我们很难用一个数组来存,这就是理想与现实之间的尴尬。
第二种方法在我们是现实时会发现它会用很长时间,这个多用的时间是多用在我们传输次数太多,显然这个想法不好。
第三种方法可一说是对第一二种方法的优化,只要我们把握好“一定大小”我们可以在短时间完成这个任务。
以上这么说可能有点抽象且枯燥,用一个比喻大家就懂了(PS这个比喻出自左哥,由于比喻的很贴切,where稍加改动引用之)
大家都搬过宿舍吧,假如你要从七楼搬到五楼,你每次只拿一本书,这样你恐怕搬一天都搬不完,你要是力量无限大,一次性搬下来这当然最省事,但这显然是不现实的,我们正常时先打包,然后每次搬一包(当然这一包是你力所能及的最大化)这样的话我们肯定是最快的。
具体代码:
package exercise0814;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 文件复制
* @author where
*
*/
public class Filecopy {
/**
* 主函数入口
* @param args
*/
public static void main(String[] args){
//这是where在桌面创的文件
String path ="C:\\Users\\lenovo\\Desktop\\aa.txt";
// 复制文件
String path1 = "C:\\Users\\lenovo\\Desktop\\dd.txt";
Filecopy f = new Filecopy();
f.copyfile(path,path1);
}
/**
* 复制文件的方法
*
*/
public void copyfile(String path,String path1){
long time = System.currentTimeMillis();
try{
//创建文件输入流对象
InputStream ins = new FileInputStream(path);
//创建输出流管道
OutputStream ous = new FileOutputStream(path1);
//从输入流管道中读取数据
byte[] b = new byte[500];//每次取100个数据传输
int a;
//当文件仍没被传输完时
while((a=ins.read(b))!=-1){
ous.write(b);
}
}
catch(Exception ef){
ef.printStackTrace();
}
//统计程序执行时间
long time1 = System.currentTimeMillis();
System.out.println("复制用时:"+(time1-time)+"毫秒");
}
}