本次我们学习了如何用字节流进行文件的复制,但由于字节复制速度问题,不太适合复制除了文本文档的一些大文件。所以,本次作业,我们就来改进如何去提高文件复制的效率。
Java实现文件拷贝其实质上就是使用java提供的三种文件流操作,字节流,字符流,二进制流。
字节流:FileInputStream 与 FileOutputStream,也就是老师上课所讲的内容,这个复制速度比较慢,字节流读取文件的单位为字节,对于英语字母(只占一个字节)不受任何影响,而对于中文文字在unicode编码为两个字节(或者以上?)则可能会造成影响。
字符流:FileReader 和 FileWriter,字符流读取文件的单位为字符,没有上述字节流的弊端,而且其提供缓冲区读取/写入,更加方便与高效。
二进制流:DataInputStream 和 DataOutputStream,二进制流本质上也属于字节流,但是它在读取/写入文件时把文件内容转化为二进制的方式读取/写入,不易出错而且极为高效,一般用于读取/写入视频等大文件信息。
所以,为了提升文件的复制速度,我们改用二进制流进行复制。代码如下:
package fuzhiwenjian; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class copy { public static void main(String[] args) { FileOutputStream outputStream; try { outputStream = new FileOutputStream("b.mp3",true); FileInputStream inputStream = new FileInputStream("a.mp3"); DataInputStream dataInput = new DataInputStream(inputStream); DataOutputStream dataOutput = new DataOutputStream(outputStream); byte []wxj = new byte[1024]; int length = dataInput.read(wxj); while(length!=-1){ dataOutput.write(wxj,0,length); length = dataInput.read(wxj); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
通过测试,使用二进制流进行文件的复制速度,从运行程序到完成,不到一秒钟的时间。可以说是极大的提升了文件的复制速度。所以,以后在复制大文件时,采用二进制流会更加的高效与快捷。
本次作业使我对字节流与字符流的概念有了更加清晰的认识,也对程序优化方面有了一个笼统的概念,好程序不光需要正确,还要在保证正确的同时,尽可能的提升软件运行处理的速度,这样的软件才是一个好软件。