读书人

字节流与字符源性能比较

发布时间: 2012-12-18 12:43:41 作者: rapoo

字节流与字符流性能比较

????? 最近在做一个基于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 比较

读书人网 >编程

热点推荐