在Java I/O中,“流”和“缓冲区”到底意味着什么?
我刚刚学习了使用BufferedReader
进行输入/输出
我想知道Stream
和Buffer
的确切含义是什么
这一行代码为我们提供了什么服务:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
你可以在下面搜索框中键入要查询的问题!
我刚刚学习了使用BufferedReader
进行输入/输出
我想知道Stream
和Buffer
的确切含义是什么
这一行代码为我们提供了什么服务:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
# 1 楼答案
缓冲区是存储器中用于存储来自外围设备的数据流的一部分。然后从这个缓冲区收集数据流,并将其存储在变量中。流可以定义为连续的数据流
术语“输入/输出”的意思就是将数据移入和移出缓冲区。一直记住这一点。进程通过请求操作系统从缓冲区中释放数据(写操作)或用数据填充缓冲区(读操作)来执行I/O
Logical Diagram of how data moves
简单地说,想象一下,当你在键盘上键入数据时,数据通过一个管道(流)移动到缓冲区,然后从缓冲区移动到磁盘(写入操作)。 同样,当数据从磁盘移动到缓冲区并从缓冲区移动到控制台时,也就是读取操作
为了更好地理解,你可以阅读这些链接。希望有帮助
What is buffer in Java
enter link description here
# 2 楼答案
流是点之间传递的连接和实际信息。缓冲区是一个存储容器,用于存储部分或全部流数据,并将其提供给输出设备
当然,关键是如果流的速度超过显示数据所需的数据速率,那么输出将暂停。缓冲区防止了这种情况
# 3 楼答案
对于每个人来说,谁开始研究java都是一个问题。io包。为了回答您的问题,术语InputStreamReader和BufferedReader仅代表java对象(它们没有什么特别之处),但它们是为io操作而创建的,比如从文件、对象等不同的输入/输出进行读写
现在我们来排队
InputStreamReader是读取字节输入流的类。但是读取每个字节是一项昂贵的操作,所以我们将其包装在BufferedReader周围,以使其得到缓冲(这是装饰器模式)
所以,即使在开始读取之前,bufferedReader也会在寄存器中存储一些字节块,当您执行读取操作时。它将从该位置读取,这比从控制台/文件读取成本低得多,但在InputStreamReader的情况下,每次执行磁盘访问操作时都会执行读取操作
# 4 楼答案
Java有两种用于输入和输出(I/O)的类:流和读写器
流(
InputStream
、OutputStream
以及扩展这些流的所有内容)用于从文件、网络或任何其他设备读取和写入二进制数据读者和作者是用来阅读和书写文本(字符)的。它们是流之上的一层,使用character encoding将二进制数据(字节)转换为字符并返回
从磁盘逐字节读取数据的效率非常低。加速的一种方法是使用缓冲区:不是一次读取一个字节,而是一次读取几千个字节,然后将它们放在内存中的缓冲区中。然后可以逐个查看缓冲区中的字节
Oracle的Java教程about I/O对此进行了详细解释
查看您提供的代码行:
System.in
是一个InputStream
。创建一个InputStreamReader
,从System.in
读取字节。然后用BufferedReader
包装最后,你有一个
BufferedReader
从一个InputStreamReader
读取System.in
# 5 楼答案
缓冲区:
它是一个物理内存存储器的区域,用于在数据从一个地方移动到另一个地方时临时存储数据。在大多数情况下,物理内存存储将是RAM(随机存取内存)
但是从这个问题的上下文来看,缓冲区是在读/写数据时使用的。在将数据从一个地方移动到另一个地方时,不需要使用它
缓冲区示例:如果您的系统有4GB内存,系统可以为缓冲区分配4KB内存(RAM)。KB-千字节,GB-千兆字节
I/O Stream(或)流:
I/O表示输入/输出
所以,输入流可以是一个输入源,比如磁盘文件、网络连接等
而且,输出流可以是一个输出目的地,如磁盘文件、网络连接等
根据JAVA official documentation,流有三种类型
字节流:
字节输入流类以原始字节的形式获取输入。 字节输出流类以原始字节的形式提供输出
InputStream
-直接已知子类OutputStream
-直接已知子类字符流: 它们是字节流之上的一层。它们使用字符编码将字节(二进制数据)转换为字符,将字符转换为字节
Reader
-直接已知子类Writer
-直接已知子类字节流&;字符流使用无缓冲I/O
缓冲流:
程序可以将无缓冲流转换为缓冲流 使用包装习惯用法,其中无缓冲流对象被传递给缓冲流类的构造函数
例如:
有4个缓冲流类用于包装未缓冲流:
要创建缓冲的字节流,请使用
BufferedInputStream
和BufferedOutputStream
类要创建缓冲的字符流,请使用
BufferedReader
和BufferedWriter
类