[英]What exactly does “Stream” and “Buffer” mean in Java I/O?
我刚刚使用BufferedReader
了解了输入/输出。
我想知道Stream
和Buffer
这个术语的确切含义是什么?
这行代码还为我们提供了什么:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Java有两种输入和输出类(I / O): 流和读/写器 。
Streams( InputStream
, OutputStream
和扩展它们的所有内容)用于从文件,网络或任何其他设备读取和写入二进制数据。
读者和作者用于阅读和书写文字(字符)。 它们是流的顶层,使用字符编码将二进制数据(字节)转换为字符并返回。
逐字节地从磁盘读取数据效率非常低。 加快速度的一种方法是使用缓冲区:不是一次读取一个字节,而是一次读取几千个字节,并将它们放在内存中的缓冲区中。 然后你可以逐个查看缓冲区中的字节。
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种类型。
字节流:
它们执行8位字节的输入和输出。 所有字节流类都来自InputStream和OutputStream 。
字节输入流类获取输入作为原始字节 。 字节输出流类将输出作为原始字节 。
InputStream
- 直接已知子类
AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.
OutputStream
- 直接已知子类
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
角色流:它们是Byte Streams之上的一层。 它们使用字符编码将字节(二进制数据)转换为字符,将字符转换为字节。
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,请使用BufferedInputStream
和BufferedOutputStream
类。
要创建缓冲的 字符流,请使用BufferedReader
和BufferedWriter
类。
流是在点之间传递的连接和实际信息。 缓冲区是存储容器,其存储部分或全部流数据并将其提供给输出设备。
当然,关键是如果流减慢超出显示数据所需的数据速率,则输出将暂停。 缓冲区阻止了这一点。
缓冲区是存储器中用于存储来自外围设备的数据流的部分。 然后从该缓冲区收集该数据流并将其存储在变量中。 流可以定义为连续的数据流。
术语“输入/输出”仅仅意味着将数据移入和移出缓冲区。 请始终牢记这一点。 进程通过请求操作系统执行I / O,该数据要从缓冲区中排出(写入操作)或者缓冲区充满数据(读取操作)。
数据如何移动的逻辑图
简单来说,想象当您在键盘中键入数据时,数据将通过管道( 流 )移动到缓冲区,然后从缓冲区移动到磁盘(写入操作)。 类似地,当数据从磁盘移动到缓冲区并从缓冲区移动到控制台时,它就是读操作。
您可以阅读链接以便更好地理解。 希望能帮助到你!。
什么是Java中的缓冲区
在此输入链接描述
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.