第十个代码模型】综合案例:文件拷贝
什么叫文件拷贝:
在windows下有一个copy命令,
该命令的使用格式:
copy 源文件路径 目标文件路径;
而现在希望可以通过程序来实现这样的操作命令,就是建立一个Copy程序类,这个程序类通过初始化的参数接受源文件和目标文件路径。
实现分析:
- 如果要想实现数据的拷贝肯定是要通过流的模式来完成,对于流有两类:字节流,字符流。
由于要拷贝的内容不一定是文字数据,也有可能是二进制的数据,所以用字节流会比较好;
- 在进行拷贝的时候需要确定拷贝模式:
在程序中开辟一个数组,这个数组的长度为文件的长度,将所有的数据一次性读取到该数组之中,随后进行输出;
如果文件过大,那么该程序无法使用
应该采用边写,边读的方式完成;
范例:代码初期模型
Package cn.mnldn.demo;
Import java.io.File;
Import java.io.FileInputStream;
Import java.io.FileOutputStream;
Import java.io.IOException;
代码问题:
1.在开发里面尽量不要使用do while,尽量去使用while循环
2.拷贝速度很慢
解决do while问题
//1.temp=input.read(),表示读取输入流中的一个字节;
//2.(temp=input.read())!=-1,判断这个读取后的字节(保存在temp)是否为-1,如果不是表示有内容
While((temp=input.read())!=-1{
Output.write(temp);
}
以上的方式是针对于一个字节的模式完成的,实际之中如果文件太大,这种做法一定不可取
如何变快,解决读取慢的问题:
就要加大一个缓冲,一次性读取多个字节数据,开辟一个字节数组。
读取:
/**
*实现具体的文件拷贝操作
*@param input 输入流对象
*@param output 输出流对象
*/
Private static void
copyHandle(InputStream input,OutputStream output) throws IOException
Long start=System.currentTimeMillis();
// inputStream有一个读取单个字节的方法:int read();
// OutputStream有一个输出单个字节的方法:void write(int data)
Int temp=0;
Byte data[]=new byte[4096];
//1.temp= input.read(data).表示将数据读取到字节数组之中,而后返回数据读取个数;
//2. (temp= input.read())!=-1.判断这个读数的个属于(保存在temp)是否为-1,如果不是表示有内容
While((temp=inputk.read(data))!=-1{
Output.wtite(data,0,temp);//输出部分字节数组
}
Long end =System.currentTimeMillis();
System.out.println(“【统计】拷贝文件所花费时间:”+(end-start));
以上是程序核心代码,也是会用最多的形式。
如果现在要求你处理的数据都在InputStream里面需要输出,就采用以上模型。