您的当前位置:首页正文

字节流与字符流性能比较

2024-11-30 来源:个人技术集锦

      最近在做一个基于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中还有一些流,我没有一个个玩,有兴趣的去弄弄撒,木哈哈~

显示全文