繁体   English   中英

“流”和“缓冲区”究竟在Java I / O中意味着什么?

[英]What exactly does “Stream” and “Buffer” mean in Java I/O?

我刚刚使用BufferedReader了解了输入/输出。

我想知道StreamBuffer这个术语的确切含义是什么?

这行代码还为我们提供了什么:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

Java有两种输入和输出类(I / O): 读/写器

Streams( InputStreamOutputStream和扩展它们的所有内容)用于从文件,网络或任何其他设备读取和写入二进制数据。

读者和作者用于阅读和书写文字(字符)。 它们是流的顶层,使用字符编码将二进制数据(字节)转换为字符并返回。

逐字节地从磁盘读取数据效率非常低。 加快速度的一种方法是使用缓冲区:不是一次读取一个字节,而是一次读取几千个字节,并将它们放在内存中的缓冲区中。 然后你可以逐个查看缓冲区中的字节。

Oracle 关于I / O的Java教程详细解释了它。

查看您提供的代码行:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

System.in是一个InputStream 您创建一个InputStreamReader ,从System.in读取字节。 然后将其包装在BufferedReader

因此,最后,您有一个BufferedReader ,它从一个从System.in读取的InputStreamReader读取。

那是一个在everbodys头脑中开始研究java.io包的问题。 要回答你的问题,术语InputStreamReader和BufferedReader只代表java对象(没有什么特别之处)但它们是为io操作创建的,比如从/向不同的输入/输出(如文件,对象等)读取和写入

现在让我们来吧

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

InputStreamReader是读取输入字节流的类。但是读取每个字节是昂贵的操作所以我们将它包装在BufferedReader周围以使其缓冲(这是装饰器模式)

因此,即使在开始读取之前,bufferedReader将在寄存器中存储一些字节并执行读取操作。 它将从该位置读取,这比从控制台/文件读取便宜得多但是在InputStreamReader的情况下,每次执行磁盘访问操作时执行读取操作

缓冲:

它是物理内存存储 区域 用于在数据从一个位置移动到另一个位置时临时存储数据。 在大多数情况下, 物理内存存储将是RAM (随机存取存储器)。

但是从这个问题的上下文中,在读/写数据时使用了Buffer 将数据从一个地方移动到另一个地方时不需要使用它。

缓冲区示例:如果您的系统有4 GB的RAM,则系统可以为缓冲区分配4 KB的内存(RAM)。 KB - Kilobyte(s),GB - Gigabyte(s)

I / O流 (或)流:

I / O Stream表示输入源或输出目标。 流可以表示许多不同类型的源和目标,包括磁盘文件,设备,其他程序和内存阵列。

I / O表示输入/输出。

因此,输入流可以是磁盘文件,网络连接等输入源。

并且,输出流可以是输出目的地,如磁盘文件,网络连接等。

根据JAVA官方文档 ,Streams有3种类型。

  1. 字节流 (读取或写入字节)
  2. 字符流 (读或写字符)
  3. 缓冲流 (从缓冲区读取或写入,以提高效率)

字节流:

它们执行8位字节的输入和输出。 所有字节流类都来自InputStreamOutputStream

字节输入流类获取输入作为原始字节 字节输出流类将输出作为原始字节

InputStream - 直接已知子类

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.

OutputStream - 直接已知子类

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

角色流:它们是Byte Streams之上的一层。 它们使用字符编码将字节(二进制数据)转换为字符,将字符转换为字节。

所有字符流类都来自ReaderWriter

Reader - 直接已知的子类

BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

Writer - 直接已知的子类

BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

字节流和字符流使用无缓冲的I / O.

这意味着每个读取或写入请求都由底层操作系统直接处理。 这可以使程序效率低得多,因为每个这样的请求经常触发磁盘访问,网络活动或一些相对昂贵的其他操作。 为了减少这种开销,Java平台实现了缓冲的I / O流。

缓冲流:

缓冲输入流称为缓冲区的存储区读取数据 ; 仅当缓冲区为空时才调用本机输入API。

类似地,缓冲输出流将数据写入缓冲区 ,并且仅在缓冲区已满时才调用本机输出API。

程序可以使用包装惯用法将无缓冲的流转换为缓冲流,其中无缓冲的流对象被传递给缓冲流类的构造函数。

例:

inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));

有4个缓冲流类用于包装无缓冲的流:

要创建缓冲的 Byte Streams,请使用BufferedInputStreamBufferedOutputStream类。

要创建缓冲的 字符流,请使用BufferedReaderBufferedWriter类。

流是在点之间传递的连接和实际信息。 缓冲区是存储容器,其存储部分或全部流数据并将其提供给输出设备。

当然,关键是如果流减慢超出显示数据所需的数据速率,则输出将暂停。 缓冲区阻止了这一点。

缓冲区是存储器中用于存储来自外围设备的数据流的部分。 然后从该缓冲区收集该数据流并将其存储在变量中。 流可以定义为连续的数据流。

术语“输入/输出”仅仅意味着将数据移入和移出缓冲区。 请始终牢记这一点。 进程通过请求操作系统执行I / O,该数据要从缓冲区中排出(写入操作)或者缓冲区充满数据(读取操作)。
数据如何移动的逻辑图

简单来说,想象当您在键盘中键入数据时,数据将通过管道( )移动到缓冲区,然后从缓冲区移动到磁盘(写入操作)。 类似地,当数据从磁盘移动到缓冲区并从缓冲区移动到控制台时,它就是读操作。

您可以阅读链接以便更好地理解。 希望能帮助到你!。
什么是Java中的缓冲区
在此输入链接描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM