在Java I / O中,“Stream”和“Buffer”是什么意思?

我刚刚了解到使用BufferedReaderinput/输出。

我想知道StreamBuffer这个术语到底是什么意思?

此外,这行代码服务于我们:

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

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

Streams( InputStreamOutputStream和扩展这些的所有东西)用于从文件,networking或任何其他设备读取和写入二进制数据。

读者和作者是阅读和写作文字(人物)。 它们是stream上的一层,它使用字符编码将二进制数据(字节)转换为字符,并将其转换回来。

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

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

看看你提供的代码行:

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

System.in是一个InputStream 。 您创build一个从System.in中读取字节的InputStreamReader 。 然后你把它包装在一个BufferedReader

所以,最后,你有一个BufferedReader读取从System.in中读取的InputStreamReader

那么,它开始在java.io包上工作是一个永恒的问题。 回答你的问题条件InputStreamReader和BufferedReader只代表Java对象(没有什么特别的关于它们),但是它们是为了像读写文件,对象等不同的input/输出这样的io操作而创build的

现在让我们来看看

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

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

那么甚至在你开始读之前会发生什么,bufferedReader会将一些字节存储在寄存器中,当你执行读操作的时候。 它将从该位置读取,这比从控制台/文件读取要便宜得多。但是在InputStreamReader的情况下,当每次进行磁盘访问操作时执行读取操作

stream :stream是可以读取或写入的数据stream。 stream通常连接到数据源或数据目标,如文件,networking连接等。

Buffer(缓冲区) :特定基本types数据的容器。 缓冲区是特定基本types元素的线性有限序列。 除了内容之外,缓冲区的基本属性是其容量,限制和位置:

缓冲:

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

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

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

I / Ostream (或)stream:

I / Ostream表示input源或输出目标。 stream可以表示许多不同types的源和目标,包括磁盘文件,设备,其他程序和内存数组。

I / O意味着input/输出。

因此,inputstream可以是一个input源,如磁盘文件,networking连接等。

而且,输出stream可以是磁盘文件,networking连接等的输出目的地。

根据JAVA官方文档 ,Streams有三种types。

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

字节stream:

它们执行8位字节的input和输出。 所有的字节stream类都来自InputStream和OutputStream 。

字节inputstream类获取input为原始字节 。 字节输出stream类将输出作为原始字节

InputStream直接已知的子类

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

OutputStream直接已知的子类

 ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream 

字符stream:它们是字节stream之上的一个层。 他们使用字符编码将字节(二进制数据)转换为字符和字符。

所有的字符stream类都来自Reader和Writer 。

Reader – 直接已知的子类

 BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader 

Writer – 直接已知的子类

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

字节stream和字符stream使用无缓冲的I / O。

这意味着每个读取或写入请求都是由底层OS直接处理的。 这可能会使程序效率低得多,因为每个这样的请求通常会触发磁盘访问,networking活动或其他相对昂贵的操作。 为了减less这种开销,Java平台实现了缓冲的I / Ostream。

缓冲stream:

缓冲inputstream称为缓冲区的存储区读取数据 ; 本机inputAPI仅在缓冲区为空时调用。

同样,缓冲输出stream将数据写入缓冲区 ,只有在缓冲区满时才调用本地输出API。

程序可以使用包装成语将未缓冲的stream转换为缓冲stream,其中,将未缓冲的stream对象传递给缓冲stream类的构造函数。

例:

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

有4个缓冲stream类用于包装未缓冲的stream:

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

要创build缓冲的 字符stream,请使用BufferedReaderBufferedWriter类。

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

当然,重要的是,如果数据stream的速度超过了显示数据所需的数据速率,那么输出就会暂停。 缓冲区阻止了这一点。