最近在做一个基于JMF的视频聊天软件,视频算是通了,今天准备整下文件传输
以前听说过字节流与字符流的概念,今天意外玩了一下,发现不玩不知道,一玩吓一跳..........
以前用InputStream、OutputStream做过一些关于文件读取复制的小练习,当操作的文件超过3M的时候就明显感到吃力了,当时对这个没什么兴趣,没想过去改进,做完了事。直到今天玩了字符流,才重新燃起好奇心
特别说明:
字符流因为处理的是字符,所以如果文件中包含所用字符集中没有的字符时(典型的是y上面两点的字符),那么复制完后将会得到一个损坏的文件,因此字符流只适用于对文本文件的处理,而对于多媒体文件就不适用。
由于一时找不到大点的文本文件,所以以下测试文件均为多媒体文件,目的只是测试流的性能,特此说明!
FileInputStream/FileOutputStream 和 对应Reader/Writer 性能比较:
字节流与字符流,顾名思义,前者是以字节为基础的,即一个byte,后者是以字符为基础,即两个byte(一个char),就速度来说,理论上后者要比前者快2倍,我们来测试下:
所用测试文件为“E:\KuGou\my all.mp3”,大小为8.47MB
package cn.netjava.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class FileCopy { //原始文件 private File file = new File("E:\\KuGou\\my all.mp3"); //复制品 private File copy = new File("E:\\copy.mp3"); public void startCopy(){ try{ FileInputStream fin = new FileInputStream(file); FileOutputStream fout = new FileOutputStream(copy); int i = 0; //记录下开始时间 long start = System.currentTimeMillis(); while(true){ //采用一读一写模式 i = breader.read(); if(i==-1){ break; } bwriter.write(i); } //记录下结束时间 long end = System.currentTimeMillis(); //总耗时 long total = end - start; System.out.println("总耗时: "+total+"ms"); //关闭流 reader.close(); writer.flush(); writer.close(); }catch(Exception e){ e.printStackTrace(); } } public static void main(String args[]){ FileCopy f = new FileCopy(); f.startCopy(); } }
运行后结果为“108351ms”,汗...复制一个8M多的音乐文件竟然用了100多秒,改进下
换成InputStreamReader和OutputSrtreamReader
FileInputStream fin = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(fin); FileOutputStream fout = new FileOutputStream(copy); OutputStreamWriter writer = new OutputStreamWriter(fout);
while(true){ //采用一读一写模式 i = reader.read(); if(i==-1){ break; } writer.write(i); }
再次运行,结果为“3436ms”,耗时由100多秒缩减到不到5秒,这可不是单纯的“2倍”啊
由此再进一步,和BufferedReader/BufferedWriter比较一下
InputStreamReader/OutputStreamWriter 和 BufferedReader/BufferedWriter 性能比较
见识到InputStreamReader的强大后又发现了BufferedReader,Buffer是缓冲的意思,IT中凡是加了“缓冲”的都是优化过的,来测试看看
测试文件为“E:\fairy tail\妖精的尾巴[01].rmvb”,大小为135MB
//原始文件 private File file = new File("E:\\fairy tail\\妖精的尾巴[01].rmvb"); //复制品 private File copy = new File("E:\\copy.rmvb");
测试结果为“48437ms”
接下来换成BufferedReader/BufferedWriter
FileInputStream fin = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(fin); BufferedReader breader = new BufferedReader(reader); FileOutputStream fout = new FileOutputStream(copy); OutputStreamWriter writer = new OutputStreamWriter(fout); BufferedWriter bwriter = new BufferedWriter(writer);
while(true){ //采用一读一写模式 i = breader.read(); if(i==-1){ break; } bwriter.write(i); }
运行结果为“19438ms”,带个Buffer果然不一样,速度又快了很多
I/O中还有一些流,我没有一个个玩,有兴趣的去弄弄撒,木哈哈~