【Java】缓冲流如何提高性能

前言

本文写的粗糙,仅作于工作间隙的随笔。

传统的Java IO是基于阻塞的,他的工作状态就是“读/写,等待,读/写,等待······”。

缓冲流有字节和字符两种,原理上几乎差不读,本处以字节缓冲路来进行讨论。

一、缓冲输入流

BufferedInputStream extends FileInputStream,缓冲流的设计思想是基于装饰器设计模式的,需要在构造缓冲流的时候传入一个节点流。

缓冲输入流为什么能够提高效率?

简单一句话就是空间换时间。read方法虽然是一个字节一个字节的返回数据,但是他实际上是一次就读取了buf个字节,然后从buf中返回给read方法,如果取光了,在read一次,如此往复。也就是说,采用了缓冲技术之后,缓冲流调用本地IO的次数变为file.length/buf.length,默认buf是8192个字节,因此read方法的性能提高了约8192倍。当然这不是不需要花费代价的,花费的代价就是多消耗了8191个内存字节。

read(arr[])最终也是使用了read(arr[], int, int)方法,此处两者合在一起介绍。

采用了缓冲技术的read(arr)方法,如果arr.length>=buf.length,那么将不会在使用buf,而是直接将磁盘上的数据填充到arr,这样才能保证最好的性能,但是可能引入的风险是arr的大小没有控制好,导致内存紧张;如果arr.length<buf.length,那么还是依旧读满整个buf,然后从buf中将数据System.arrayCopy到arr中,没有了再次读取磁盘到buf,如此重复,实际上最终和磁盘交互的并不是BufferedInputStream,而是通过构造器注入的其他节点流的native
read(arr[])来实现,代码较多,而且CSDN图片抽风,就不再I贴出来了,自行观赏源码吧!

二、缓冲输出流

BufferedOutputStream extends FileOutputStream。

read(int)方法的思想还是空间换时间,使用缓冲技术,则每次都是写buf,直到buf写满了才会把数据刷到磁盘(刷盘的过程是调用构造方法中传入的节点流的write(arr[])来实现的,而不是直接调用native write(int)实现),没有使用缓冲技术,那么每个字节都需要消耗本地的IO资源,写一个字节,使用一次IO资源,然后再阻塞再写,如此重复。

wirte(arr[])最终调用write(arr[], int, int),思想是将arr中的数据刷到磁盘。使用了缓冲流技术,如果arr.length>=buf.length,则直接将arr中的数据刷盘;如果arr.length<buf.length,则将数据写入buf,直到buf写满了才会刷盘,刷盘的过程也是调用构造方法中传入的节点流的write(arr[], int, int)完成。

三、总结

缓冲流之所以能够提高性能,主要是利用了在内存中开辟的buf空间来实现的,减少了直接消耗系统IO资源的次数,从而提高了性能。

时间: 2024-08-20 17:55:53

【Java】缓冲流如何提高性能的相关文章

通过系统缓冲流类提高I/O操作

Java语言中一般的输入与输出流类,都是采用单字节的读取方法,进行数据I/O操作的.也就是每次只读取或写入一个字节的数据,这种方法显然繁琐而低效.其读取与写入的流程图,如图1所示: 打个比方: 假设在A地有100本图书,需要把这些图书从A地运送到B地. 如果每次从A地只拿一本图书到B地,则需要往返A.B两地100次: 如果每次从A地取10本图书到B地,则只需要10次就可以完成这个任务. 显然,后者的效率要高.这个故事中的"每次拿10本"相当于I/O操作的"缓冲区".

Java 编程:如何提高性能?(简单总结篇)

开发者在编程中除了要有编程规范,还要注意性能,在 Java 编程中有什么提高性能的好办法呢? 本文转自国内 ITOM 行业领军企业 OneAPM Cloud Insight(一款能够优雅监控多种操作系统.数据库.中间件.云主机的解决方案)美女工程师陈永梅简书. 开发者在编程中除了要有编程规范,还要注意性能哦,今天就工作中遇到的一些问题进行了一个简单总结,希望攻城狮来批评指正. 作为一个QA,从质量管理方面得到的认识: 一行代码能解决的问题 尽量不要使用多行,代码行数越多 维护成本越高,出现缺陷的

java 缓冲流

缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写效率,同时增加了一些新的方法. 四种缓冲流 BufferedReader(Reader in) BufferedReader(Reader in,int sz)//sz表示自定义缓冲区大小 BufferedWriter(Writer out) BufferedWriter(Writer out,int sz) BufferedInputStream(InputStream in) BufferedInputStream(

java 缓冲流 Buffer

缓冲流 Buffer :设置缓冲区加快执行效率 子类: (一)BufferedInputStream : 缓冲输入字节流 ,目的:提高读取文件的效率  注意: BufferedInputStream 他是没有读写数据的功能 内部实现 : 你面维护了一个8字节的byte数组. 使用步骤:        1.找到一个目标文件.        2.建立通道 new FileInputStream(" ");        3.创建一个缓冲字节输入流  new BufferedInputStr

java缓冲流,BufferedReader,BufferedWriter 详解

缓冲流,BufferedReader,BufferedWriter 1)BufferedReader,BufferedWriter是更高级的流,二者的源和目的地必须是字符输入流和字符输出流.如果把字符输入流做为BufferedReader流的源,把字符输出流作为BufferedWriter流的目的地,那么BufferedReader,BufferedWriter将有更强的读.写能力. //构造函数 BufferedReader(Reader in); BufferedWriter(Writer

关于Java缓冲流的一点误解

我在网上看到很多输入流和输出流的代码是这样的: public class BufferedTest { public static void main(String[] args) { InputStream in = null; OutputStream out = null; try { // 此处为演示效果 将in和out都定义在try块内 防止自动关闭 in = new BufferedInputStream(new FileInputStream("collect.txt")

Java IO之处理流(缓冲流、转换流)

一.处理流: 增强功能,提供性能,在节点流之上. 二.节点流与处理流的关系 节点流(字节流.字符流)处于IO操作的第一线,所有操作必须通过它们进行: 处理流可以对其他流进行处理(提高效率或操作灵活性). 三.缓冲流 1.字节缓冲流 BufferedInputStream BufferedOutputStream package IOBuffer; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im

java的 IO流之缓冲流(转载)

java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装.当对文件或其他目标频繁读写或操作效率低,效能差.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来,然后一起写入或读取出来.所以说,缓冲流还是很重要的,在IO操作时记得加上缓冲流提升性能. 缓冲流分为字节和字符缓冲流 字节缓冲流为: BufferedInputStream-字节输入缓冲流 BufferedOutputStream-字节输出缓冲流 字符缓冲流为: BufferedReader-字符

【java的 IO流之缓冲流】

java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装.当对文件或其他目标频繁读写或操作效率低,效能差.这时使用缓冲流能够更高效的读写信息.因为缓冲流先将数据缓存起来,然后一起写入或读取出来.所以说,缓冲流还是很重要的,在IO操作时记得加上缓冲流提升性能. 缓冲流分为字节和字符缓冲流 字节缓冲流为: BufferedInputStream-字节输入缓冲流 BufferedOutputStream-字节输出缓冲流 字符缓冲流为: BufferedReader-字符