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数据读来。从微观角度来说,设置缓冲效率要高很多。尽管,不能从这个程序上看出来。 几万字的读写\就能看到差距
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-14
如果是边读边写,就会很慢,也伤硬盘。缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高。追问

是不是可以通过byte[] 数组来声明缓冲区的大小?

追答

是的。对于IO类,也是使用byte数组的

本回答被提问者采纳
第2个回答  2011-03-28
缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高。
第3个回答  2011-03-28
原理就是预先读取字节流存入内存,以后只操作内容,这样效率高

Java中IO缓冲区的原理是什么?
如果是边读边写,就会很慢,也伤硬盘。缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高。调用I\\O操作的时候,实际上还是一个一个的读或者写,关键就在,CPU只有一个,不论是几个核心。CPU在系统调用时,会不会还要参与主要操作?参与多次就会...

Java.IO中 为什么带缓冲的字节输入输出流速度比不带缓冲的速度快
原理:通过将字节缓冲到内存然后到磁盘比直接通过程序输出到磁盘要快。缓冲:就是通过缓冲流操作字节读或写入内存。在内存中就是以流的形式输出。总结:从内存读取数据比从磁盘读取数据要快。

Javaio缓冲区为什么不直接开辟大空间
Javaio缓冲区不直接开辟大空间原因:有效地管理系统资源,方便用户使用的程序集合。(操作系统是加在裸机上的第一层软件,是用户与计算机的接口)。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,如果缓冲区数据不足,才会再从文件中读取。这里的缓冲区应该是在硬盘中。使用Bu...

关于java的io读写,缓冲区是如何提高读写效率的???
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class TestBuffer { public static void main(String args[]) throws IOException { String from = "f:\/1.MP3";System.out.println(from);long startTime1 = System.currentTimeMillis();TestBuffer.readWr...

深入理解javaio读写原理及底层流程
JavaIO读写是编程中处理输入输出的基石,不论是Socket通信还是文件操作,其原理和流程基本一致,主要依赖于read和write系统调用。尽管不同操作系统可能有不同的名称,但功能核心不变。核心概念是read和write系统调用,它们并非直接操作物理设备,而是将数据在内核缓冲区和进程缓冲区之间进行复制。数据的实际交换...

小师妹学JavaIO之:Buffer和Buff
因为NIO是按Block来读取数据的,这个一个Block就可以看做是一个Buffer。我们在Buffer中存储要读取的数据和要写入的数据,通过Buffer来提高读取和写入的效率。更多精彩内容且看:更多内容请访问 www.flydean.com 还记得java对象的底层存储单位是什么吗?小师妹:这个我知道,java对象的底层存储单位是字节Byte。

java.ioJava流输入输出原理
CharArrayReader 和 CharArrayWriter 实现了字符输入输出流的缓冲区。Console 类提供了访问 Java 虚拟机关联的基于字符的控制台设备的方法。DataInputStream 和 DataOutputStream 允许以与机器无关的方式读写基本 Java 数据类型。File 类表示文件和目录路径名的抽象形式,FileDescriptor 类提供与基础机器相关的不...

Java 以下两个要求 怎么在Java中以程序的方式实现? (围绕CORBA和IOR...
最近在看 JAVA NIO 的相关知识,了解一下IO的底层实现原理。IO涉及到的底层的概念大致如下:1) 缓冲区操作。2) 内核空间与用户空间。3) 虚拟内存。4) 分页技术。一,虚拟存储器 虚拟存储器是硬件异常(缺页异常)、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的...

java io 中BufferedReader缓冲区提高效率的问题
道理很简单,假设你要读取一个文本文件输出到屏幕,一次读一个字节,然后赋值给声明的一个变量,那么需要读取很多次,如果用了BufferedReader,就可以一次把所有的字节都读取到缓冲区,然后再一次性赋值给变量,效率自然就提高了,写文件时也一样,一次写一个字,和一次写1篇文章的区别....

到底什么是IO?一文解析IO基础概念
缓冲IO(如标准IO)和直接IO的区别在于数据复制环节。标准IO会先将数据从磁盘读到内核空间,再复制到用户空间,而直接IO则省去这部分复制,减少系统缓存管理,但可能导致性能下降。网络IO则关注网络通信中数据的传输,而零拷贝技术在数据从磁盘到网络传输时,避免了数据在用户空间的复制,但在网络到用户...

相似回答