在Java I / O中,“Stream”和“Buffer”是什么意思?
我刚刚了解到使用BufferedReader
input/输出。
我想知道Stream
和Buffer
这个术语到底是什么意思?
此外,这行代码服务于我们:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Java有两种input输出类(I / O): stream和读写器 。
Streams( InputStream
, OutputStream
和扩展这些的所有东西)用于从文件,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。
- 字节stream (读或写字节)
- 字符stream (读取或写入字符)
- 缓冲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,请使用BufferedInputStream
和BufferedOutputStream
类。
要创build缓冲的 字符stream,请使用BufferedReader
和BufferedWriter
类。
stream是点之间的连接和实际信息传递。 缓冲区是一个存储部分或全部stream式数据的存储容器,并将其提供给输出设备。
当然,重要的是,如果数据stream的速度超过了显示数据所需的数据速率,那么输出就会暂停。 缓冲区阻止了这一点。