字节流与字符流性能比较
????? 最近在做一个基于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中还有一些流,我没有一个个玩,有兴趣的去弄弄撒,木哈哈~
1 楼 javafound 2010-12-12看一下Buffer内的源代码. 2 楼 test_lockxxx 2012-05-31 拿FileInputStream与BufferedReader比较?
你应该拿BufferedInputStream 与 BufferedReader 比较