Java I/O 中的“Stream”和“Buffer”到底是什么意思?

2022-08-31 10:26:23

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

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

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

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

答案 1

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

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

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

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

Oracle关于I / O的Java教程对此进行了详细解释。

查看您提供的代码行:

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

System.in是一个 .创建一个 从 读取字节的 。然后,将其包装在 .InputStreamInputStreamReaderSystem.inBufferedReader

因此,最后,您有一个从 读取从 读取的 。BufferedReaderInputStreamReaderSystem.in


答案 2

缓冲区:

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

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

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

I/O 流(或)流:

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

I/O 表示输入/输出。

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

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

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

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

字节流:

它们执行 8 位字节的输入和输出。所有字节流类都是 InputStream OutputStream 的后代。

字节输入流类获取作为原始字节的输入。字节输出流类将输出作为原始字节提供。

InputStream - 直接已知子类

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

OutputStream - 直接已知子类

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

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

所有字符流类都是读取器编写器的后代。

Reader- 直接已知子类

BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

Writer- 直接已知子类

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

Byte Streams 和 Character Streams 使用无缓冲 I/O

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

缓冲流:

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

同样,缓冲输出流将数据写入缓冲区,并且仅当缓冲区已满时才调用本机输出 API。

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

例:

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

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

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

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


推荐