`
vampire1126
  • 浏览: 88086 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

字节流与字符流性能比较

阅读更多

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

0
1
分享到:
评论
2 楼 test_lockxxx 2012-05-31  
拿FileInputStream与BufferedReader比较?

你应该拿BufferedInputStream 与 BufferedReader 比较
1 楼 javafound 2010-12-12  

看一下Buffer内的源代码.

相关推荐

    JAVA 字符流与字节流

    掌握字符流与字节流的原理及其应用,能够帮助Java开发者更高效、更准确地处理各种数据流,从而提升程序的性能和稳定性。在实际开发中,根据具体需求合理选择数据流类型,是提升代码质量和程序功能的关键。

    Java字符流和字节流

    ### Java字符流和字节流详解 #### 一、引言 在Java中,I/O流主要用于处理输入输出操作,包括文件读写等。根据处理数据类型的不同,Java I/O流主要分为字节流和字符流两大类。字节流处理的是8位的字节数据,而字符流...

    字节流字符流练习

    除此之外,InputStreamReader和OutputStreamWriter是字节流与字符流之间的桥梁,它们允许我们在字节流和字符流之间转换,以适应不同编码格式的需求。 在Java IO中,还有一套转换流(Wrapper Stream),即...

    Java IO 字节流 字符流

    这些缓冲流可以在字节流和字符流上进行包装,例如BufferedReader可以包裹一个InputStreamReader,从而在读取字符时提供更高效的性能。 对于工具的使用,开发者经常使用如Apache Commons IO库中的工具类,如...

    IO流学习(字节流 字符流 文本流)!

    本篇文章将详细探讨IO流中的字节流、字符流以及文本流。 首先,我们来了解一下**字节流**。字节流是最基础的IO流类型,分为输入字节流(InputStream)和输出字节流(OutputStream)。它们处理的数据单位是字节,...

    JavaIO实例_字节流_字符流_缓冲流_转换流IODemo

    在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...

    JavaIO实例|字节流|字符流|缓冲流|转换流IODemo

    3. 引入BufferedInputStream和BufferedOutputStream,实现带缓冲的文件复制,比较无缓冲与有缓冲的性能差异。 4. 使用InputStreamReader和OutputStreamWriter处理不同编码的文件,如从GBK编码的文件读取内容并保存为...

    JAVA_字节流和字符流

    `InputStreamReader`和`OutputStreamWriter`是字节流与字符流之间的桥梁。 - 常用的字符流类包括`FileReader`和`FileWriter`,用于读写文件中的文本;`StringReader`和`StringWriter`,用于字符串的读写。 - 字符...

    字节流字符流的使用方法源码+文档

    在Java编程语言中,`字节流`和`字符流`是进行输入/输出操作的基础,主要用于处理数据的传输。这两个概念是Java IO系统的核心,它们允许程序与外部设备(如硬盘、网络、内存等)交换信息。在这个压缩包中,你将找到...

    23_IO_第2天(字节流、字符流)_讲义

    本讲义主要探讨的是Java中的字节流和字符流,这是IO操作的基础,也是开发过程中频繁使用的工具。字节流和字符流是Java IO框架的两大支柱,它们分别处理原始的字节数据和经过编码的字符数据。 字节流是Java中处理二...

    数据流,对象流,字节流,字符流.docx

    根据不同的数据类型和操作方式,I/O流分为多个类别,主要包括数据流、对象流、字节流和字符流。 1. **数据流**: 数据流主要指的是InputStream和OutputStream这两类基本流。InputStream是所有读取数据的流的基类,...

    详解Java中字符流与字节流的区别

    字节流与字符流的主要区别在于: - 数据单位:字节流处理单字节,字符流处理Unicode码元。 - 应用场景:字节流适合处理二进制数据,如图片、音频文件等;字符流专用于处理文本数据,它会考虑字符编码。 - 编码与解码...

    java 字节流和字符流的区别详解

    Java 字节流和字符流的区别详解 Java 中的字节流和字符流是两种不同的输入 / 输出流,它们之间的区别是非常重要的。在本文中,我们将详细介绍 Java 中的字节流和字符流的区别,并通过示例代码来演示它们的使用。 ...

    IO各种操作文件,字符流、字节流等

    在Java IO中,主要有两种流的概念:字符流(Character Stream)和字节流(Byte Stream)。它们是处理数据的基本方式,适用于不同场景。 字符流主要处理基于字符的数据,如文本文件,它包括Reader和Writer两个抽象...

    java字节流和字符流[借鉴].pdf

    与字节流一样,字符流也有缓冲的概念,可以使用 BufferedReader 和 BufferedWriter 对性能进行优化,减少与底层 I/O 操作的交互次数。 总结: Java 的 IO 流系统是基于流的,提供了对数据的读写操作。字节流适用于...

    java IO流读写

    在Java中,IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理单个字节的数据,而字符流则处理Unicode编码的16位字符。 1. **字节流**: - `InputStream` 和 `OutputStream` 是所有...

    Java字符流与字节流区别与用法分析

    Java中的流分为两种类型:字符流(Character Stream)和字节流(Byte Stream),它们都是Java I/O系统的基础。字符流处理的是Unicode字符,而字节流则处理单个字节的数据。 字节流是最基础的流,主要包括...

    java字符流操作

    6. **字符流与字节流的区别**: 字符流处理单个字符,适合文本数据,而字节流处理原始字节,适合二进制数据。字符流依赖于特定的字符编码,而字节流不涉及字符编码。 7. **使用示例**: 在`java字符流操作.java`文件...

    ByteIO_java_字节流_

    通过`Socket`类的`getInputStream()`和`getOutputStream()`方法,可以获取到与远程服务器连接的字节流。 总的来说,`ByteIO.java`文件可能包含了字节流的基本用法,如文件读写、数据传输、缓冲优化等。通过学习和...

    day09-字节缓冲流&字符流1

    与字节流相比,字符流处理字符数据时会考虑到字符编码的问题,避免因编码转换不正确导致的数据丢失或乱码。 2.2 编码表【理解】 编码表,如ASCII、GBK、UTF-8等,是将字符映射到字节序列的规则。在处理字符流时,...

Global site tag (gtag.js) - Google Analytics