96

我刚刚了解了使用BufferedReader.

我想知道这个词Stream和的确切含义是Buffer什么?

这行代码还有什么作用:

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

5 回答 5

215

Java 有两种用于输入和输出 (I/O) 的类:读取器/写入器。

流(InputStream以及OutputStream扩展这些的所有内容)用于从文件、网络或任何其他设备读取和写入二进制数据。

Readers 和 writers 用于读取和写入文本(字符)。它们是流之上的一层,使用字符编码将二进制数据(字节)转换为字符并返回。

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

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

查看您提供的代码行:

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

System.in是一个InputStream。您创建一个InputStreamReaderSystem.in. 然后你把它包装在一个BufferedReader.

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

于 2013-04-13T06:06:03.853 回答
25

缓冲:

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

但是从这个问题的上下文来看,缓冲区是在读取/写入数据时使用的。在将数据从一个地方移动到另一个地方时不需要使用它。

缓冲区示例:如果您的系统有 4 GB 的 RAM,则系统可以为Buffer分配 4 KB 的内存(RAM) 。KB - 千字节,GB - 千兆字节

I/O 流(或)流:

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

I/O 表示输入/输出。

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

并且,Output Stream 可以是一个输出目的地,如磁盘文件、网络连接等。

根据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

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

所有字符流类都来自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 个缓冲流类用于包装非缓冲流:

要创建缓冲 字节流,请使用BufferedInputStreamBufferedOutputStream类。

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

于 2016-08-18T12:07:06.890 回答
14

好吧,对于开始研究 java.io 包的人来说,这是一个问题。要回答您的问题,术语 InputStreamReader 和 BufferedReader 仅代表 java 对象(它们没有什么特别之处),但它们是为 io 操作创建的,例如从文件、对象等不同的输入/输出读取和写入

现在让我们来排队

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

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

因此,甚至在您开始读取之前会发生什么,bufferedReader 将在寄存器中存储一些字节块以及当您执行读取操作时。它将从该位置读取,这比从控制台/文件读取便宜得多但是对于 InputStreamReader,当您每次执行磁盘访问操作时执行读取操作

于 2013-04-13T06:06:44.580 回答
3

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

当然,关键是如果流的速度超过了显示数据所需的数据速率,那么输出就会暂停。缓冲区可以防止这种情况。

于 2013-04-13T06:06:21.140 回答
1

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

术语“输入/输出”只不过是指将数据移入和移出缓冲区。一直牢记在心。进程通过请求操作系统从缓冲区中排出数据(写操作)或用数据填充缓冲区(读操作)来执行 I/O。
数据如何移动的逻辑图

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

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

于 2019-07-25T05:07:55.277 回答