「JAVA缓冲流原理图」java缓冲输出流

博主:adminadmin 2022-12-28 10:45:07 58

今天给各位分享JAVA缓冲流原理图的知识,其中也会对java缓冲输出流进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java中IO缓冲区的原理是什么

如果是边读边写,就会很慢,也伤硬盘。缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高。

调用I\O操作的时候,实际上还是一个一个的读或者写,关键就在,CPU只有一个,不论是几个核心。CPU在系统调用时,会不会还要参与主要操作?参与多次就会花更多的时间。

系统调用时,若不用缓冲,CPU会酌情考虑使用 中断。此时CPU是主动地,每个周期中都要花去一部分去询问I\O设备是否读完数据,这段时间CPU不能做任何其他的事情(至少负责执行这段模块的核不能)。所以,调用一次读了一个字,通报一次,CPU腾出时间处理一次。

而设置缓冲,CPU通常会使用 DMA 方式去执行 I\O 操作。CPU 将这个工作交给DMA控制器来做,自己腾出时间做其他的事,当DMA完成工作时,DMA会主动告诉CPU“操作完成”。这时,CPU接管后续工作。在此,CPU 是被动的。DMA是专门 做 I\O 与 内存 数据交换的,不仅自身效率高,也节约了CPU时间,CPU在DMA开始和结束时做了一些设置罢了。

所以,调用一次,不必通报CPU,等缓冲区满了,DMA 会对C PU 说 “嘿,伙计!快过来看看,把他们都搬走吧”。

综上,设置缓冲,就建立了数据块,使得DMA执行更方便,CPU也有空闲,而不是呆呆地候着I\O数据读来。从微观角度来说,设置缓冲效率要高很多。尽管,不能从这个程序上看出来。 几万字的读写\就能看到差距

缓冲流(Buffered)

缓冲流,也叫高效流,是对4个基本的Filexxx流的增强,所以也是4个流,按照数据类型分类:

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

构造方法:

BufferedoutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

BufferedoutputStream(OutputStream out,int size)创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流

参数:

OutputStream out:字节输出流

我们可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率

int size:指定缓冲流内部缓冲区的大小,不指定默认

使用步骤(重点)

1.创建FiLeOutputstream对象,构造方法中绑定要输出的目的地

2.创建BufferedOutput stream对象,构造方法中传递FileOutputStream对象对象,提高FileOutputStream对象效率

3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中

4.使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中

5.释放资源(会先调用flush方法刷新数据,第4步可以省略)

继承自父类的成员方法:

int read()从输入流中读取数据的下一个字节。

int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。

void close()关闭此输入流并释放与该流关联的所有系统资源。

构造方法:

BufferedInputStream(InputStream in)创建一个BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

BufferedInputStream(InputStream in,int size)创建具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流

参数:

Inputstream in:字节输入流

我们可以传递FileInputstream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读取效率int size:指定缓冲流内部缓冲区的大小,不指定默认

使用步骤(重点):

1.创建FileInputStream对象,构造方法中绑定要读取的数据源

2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputstream对象的读取效率

3.使用BufferedInputstream对象中的方法read,读职文件

4.释放资源

利用缓冲流复制文件,大大提高速度

java.io.Buffereduriter extends Writer Buffereduriter:字符缓冲输出流

继承自父类的共性成员方法:

-void write(int c)写入单个字符。

void write(char[]cbuf)写入字符数组。

abstract void write(char[]cbuf,int off,int Len)写入字符数组的某一部分,off数组的开始索引,Len写的字符个数。

void write(String str)写入字符串。

void write(String str,int off,int Len)写入字符串的某一部分,off字符串的开始索引,Len写的字符个数。

void flush()刷新该流的缓冲。

-void close()关闭此流,但要先刷新它。

构造方法:

Buffereduriter(uriter out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。

Buffereduriter(writer out,int sz)创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

参数:

writer out:字符输出流

我们可以传递Filewriter,缓冲流会给Filewriter增加一个缓冲区,提高Filewriter的写入效率int sz:指定缓冲区的大小,不写默认大小

特有的成员方法:

void newline()写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符换行:换行符号

windows:\rln Linux:/n mac:/r

使用步骤:

1.创建字符缓冲输出流对象,构造方法中传递字符输出流

2.调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中

3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中

4.释放资源

java.io.BufferedReader extends Reader继承自父类的共性成员方法:

int read()读取单个字符并返回。

int read(char[]cbuf)一次读取多个字符,将字符读入数组。

void close()关闭该流并释放与之关联的所有资源。

构造方法:

BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。

BufferedReader(Reader in,int sz)创建一个使用指定大小输入缓冲区的缓冲字符输入流。

参数:

Reader in:字符输入流

我们可以传递FiLeReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader的读取效率特有的成员方法:

string readline()读取一个文本行。读取一行数据行的终止符号:通过下列字符之一即可认为某行已终止:换行(‘\n')、回车(\r')或回车后直接跟着换行(\r\n)。

返回值:

包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null

使用步骤:

1.创建字符缓冲输入流对象,构造方法中传递字符输入流

2.使用字符缓冲输入流对象中的方法read/readLine读取文本

3.释放资源

java缓冲流BufferWriter的原理跟提高效率原因

不带缓冲的流的工作原理:它读取到一个字节/字符,就向用户指定的路径写出去 读一个写一个 所以就慢了

带缓冲的流的工作原理:读取到一个字节/字符,先不输出,等凑足了缓冲的最大容量后一次性写出去,从而提高了工作效率

举个现实生活中的例子:假设你是一个快递员,不带缓冲的流就像快递公司给你一份快递你就跑一次,而带缓冲的流就像快递公司给你一份快递,你先不去,等攒攒多一起送,试想一下,是不是效率提高了?

怎么理解java中BufferedInputStream的缓冲作用,就这张图中的一段代码来说,

BufferedInputStream主要是内存缓冲区,文件的读取是先将文件读取到内存中。如有程序部署是机器资源限制不可能分配很大内存,如果读取超大文件很容易造成内存溢出BufferedInputStream是将文件的一部分(大小有你指定)缓冲到内存,程序处理完后继续缓存下一个指定大小,直到全部读取。

Java程序性能优化-缓冲(Buffer)(1)

  常用优化组件和方法

本节主要介绍可用于系统性能优化的组件和性能优化思想 重点介绍缓冲和缓存这两个组件以及它们的使用方法 此外 还将介绍几种常用的优化思想 如池化对象 并行代替串行 负载均衡 以及时间换空间和空间换时间

  缓冲(Buffer)( )

缓冲区是一块特定的内存区域 开辟缓冲区的目的是通过缓解应用程序上下层之间的性能差异 提高系统的性能 在日常生活中 缓冲的一个典型应用是漏斗 如图 所示

图   缓冲的示意图

图 显示了漏斗作为缓冲区的使用场景 上层系统如茶壶 下层系统如水瓶 现需要将茶壶中的水倒入水瓶中 这就有如将内存中的数据写入硬盘中一样 茶壶的出水速度可以很快 但是水瓶的瓶口很细 因此形成性能瓶颈 要将水全部倒入瓶中 必须等待瓶口的水缓缓流下 为了加快速度 可以使用一个漏斗(缓冲)

漏斗的初始口径很大 并且拥有一定的容量 因此 茶壶中的水可以先倒入漏斗中 就有如内存数据先写入一块缓冲区 只要漏斗的容量够大 茶壶里的水很快就能倒完 至此 上层系统完成工作 可以去处理其他业务逻辑 而此时 水并未完全进入瓶中 而大部分被积累在漏斗中 这就可以由下层系统慢慢处理 直到水完全进入瓶中 漏斗(缓冲区)被清空

注意 缓冲可以协调上层组件和下层组件的性能差 当上层组件性能优于下层组件时 可以有效减少上层组件对下层组件的等待时间

基于这样的结构 上层应用组件不需要等待下层组件真实地接受全部数据 即可返回操作 加快了上层组件的处理速度 从而提升系统整体性能

缓冲最常用的场景就是提高I/O的速度 为此 JDK内不少I/O组件都提供了缓冲功能 比如 当使用FileWriter时 进行文件写操作的代码如下

Writer writer = new FileWriter(new File( file txt ))

long begin=System currentTimeMillis()

for (int i = ; i CIRCLE; i++) {

writer write(i)                                     //写入文件

}

writer close()

System out println( testFileWriter spend: +(System currentTimeMillis() begin))

为进行I/O优化 可以为FileWriter加上缓冲

Writer writer = new BufferedWriter(new FileWriter(new File( file txt )))                                                        //增加了缓冲

long begin=System currentTimeMillis()

for (int i = ; i CIRCLE; i++) {

writer write(i)

}

writer close()

System out println( testFileWriterBuffer spend: +(System currentTimeMillis() begin))

以上代码使用BufferedWriter为FileWriter对象增加缓冲功能 BufferedWriter对象拥有两个构造函数

public BufferedWriter(Writer out)

public BufferedWriter(Writer out int sz)

       返回目录 Java程序性能优化 让你的Java程序更快 更稳定

编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

       J ME移动开发实战教学视频

Visual C++音频/视频技术开发与实战

Oracle索引技术

lishixinzhi/Article/program/Java/gj/201311/27807

JAVA缓冲流原理图的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java缓冲输出流、JAVA缓冲流原理图的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-28,除非注明,否则均为首码项目网原创文章,转载请注明出处。