`
vampire1126
  • 浏览: 87500 次
  • 性别: 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 IO流技术

    字节流:按照字节读取数据(InputStream、OutputStream) 字符流:按照字符读取数据(Reader、Writer) 功能不同: 节点流:可以直接从数据源或目的地读写数据。 处理流:不直接连接到数据源或目的地,是处理流的流...

    JDK_API_1_6

    OutputStreamWriter OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。 PipedInputStream 管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的...

    java7源码-JavaIO:JavaIO

    字节流与字符流的区别 字节流在JDK1.0中就被引进了,用于操作包含ASCII字符的文件。Java也支持其他的字符如Unicode为了读取包含Unicode字符的文件,Java语言设计者在JDK1.1中引入了字符流。ACSII作为Unicode的子集,...

    lzutf8.js:高性能Javascript字符串压缩库

    是对字符编码的扩展,使用基于算法的可选压缩来扩展UTF-8字节流。 它的一些特性: 仅压缩字符串。 不支持任意字节序列。 在选择算法及其实现方面均对速度进行了强烈优化。 使用低端台式机和1MB字符串进行的近似...

    Java 基础核心总结 +经典算法大全.rar

    字节流与字符流的转换新潮的 NIO 缓冲区(Buffer)通道(Channel) 示例:文件拷贝案例 BIO 和 NIO 拷贝文件的区别操作系统的零拷贝 选择器(Selectors) 选择键(SelectionKey) 示例:简易的客户端服务器通信 集合 集合框架...

    Java中多种写文件方式的效率对比实验(图)

     近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出、字符流输出、内存文件映射输出。前两种又可以分为带buffer及不带...

    byteNet-tensorflow:用于字符级语言建模的ByteNet

    这是DeepMind的论文《字节网模型的张量流实现。 从摘要 ByteNet解码器在字符级语言建模方面达到了最先进的性能,并且优于以前通过递归神经网络获得的最佳结果。 ByteNet还在原始字符级机器翻译上实现了性能,该...

    java8集合源码分析-Awesome-Java:真棒-Java

    Java基础字节流 字符流 NIO等 Java8 Java8语言的行为参数化和流编程等 Java虚拟机 Java虚拟机相关,内存模型,类加载机制,JVM性能解析等 零散的文章 数据结构与算法 算法的度量,基础数据结构,链表,二叉树,B树,...

    Java性能优化之使用NIO提升性能(Buffer和Channel)

    这种基于流的实现以字节为单位处理数据,并且非常容易建立各种过滤器。NIO是NewI/O的简称,具有以下特性:为所有的原始类型提供(Buffer)缓存支持;使用java.nio.charset.Charset作为字符集编码解码解决方案;增加...

    nvcomp:用于在GPU上进行快速无损压缩解压缩的库

    下面是针对TPC-H和Fanny Mae的抵押数据集的级联压缩(R1D1B1)的一些数字列以及针对LZ4压缩的TPC-H的字符串列的性能与压缩比散点图。 对于TPC-H数据集,我们使用SF10 lineitem表和以下列:列0(L_ORDERKEY)作为8B...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    字节流 语言特性 继承 封装 多态 JVM 多线程与并发 GC机制 GC收集器类型 串行 CMS 并行 G1 算法 复制 标记清理 标记整理 分区 新生代 eden survivor 老年代(old区) 永久代(perm区) 版本...

    全国计算机应用基础知识:汉字、字符编码.pdf

    由于字长是计算机⼀次可处理的⼆进制数的位数,因此它与计算机处理数据的速率有关,是衡量计 算机性能的⼀个重要因素。 (2)字符的编码。 ASCII码。 计算机只能识别⼆进制数,因此计算机中的数字、字母、符号也必须...

    Java基础知识点总结.docx

    字符流与字节流 98 流对象 101 File类 102 Java.util.Properties 103 介绍IO包中扩展功能的流对象 103 十七、 网络编程 110 网络基础之网络协议篇 111 UDP传输 124 TCP传输 126 十八、 反射技术 127 十九、 Ajax原理...

    代码优化:有效使用内存.part3

    2.7.9按字节、双字与四字进行内存处理 2.7.10数据对齐 2.7.11内存访问与计算的组合 2.7.12读写操作的组合 2.7.13只在必要时才访问内存 2.7.14内置C内存处理函数的优化 2.7.15内存处理函数的优化质量 2.7.16C字符串...

    代码优化:有效使用内存.part1

    2.7.9按字节、双字与四字进行内存处理 2.7.10数据对齐 2.7.11内存访问与计算的组合 2.7.12读写操作的组合 2.7.13只在必要时才访问内存 2.7.14内置C内存处理函数的优化 2.7.15内存处理函数的优化质量 2.7.16C字符串...

    代码优化:有效使用内存.part2

    2.7.9按字节、双字与四字进行内存处理 2.7.10数据对齐 2.7.11内存访问与计算的组合 2.7.12读写操作的组合 2.7.13只在必要时才访问内存 2.7.14内置C内存处理函数的优化 2.7.15内存处理函数的优化质量 2.7.16C字符串...

    JSP动态网站开发基础教程与实验指导(从基础到应用)光盘

    5.3 字节流 99 5.3.1 使用类FileInputStream读文件 99 5.3.2 使用类FileOutputStream写文件 101 5.4 字符流 102 5.4.1 使用类FileReader读文件 103 5.4.2 使用类FileWriter写文件 104 5.5 回压字符流 106 5.6 文件...

    graphql-binary:GraphQL二进制协议,可实现较小的网络流量和解析性能

    此外,还通过删除键,以字节为单位存储整数,具有类似c的字符串\数组等方式来优化响应,类似于在模式方面与Protobuf以及在值编码方面与MessagePack相似。 对于某些开发人员,最有趣的功能是对自定义类型进行编码\...

    ByteStream.js:ByteStream.js是一组处理字节和位的类,并针对速度性能进行了优化

    Stream”对象内容表示为字符串fromHexString 从现有的十六进制字符串初始化“ Stream”对象toHexString 用十六进制字符串表示“流”对象的内容复制返回现有“流”的副本片返回现有“流”的切片重新分配更改现有“流...

Global site tag (gtag.js) - Google Analytics