Java I/O 中的“Stream”和“Buffer”到底是什么意思?
我刚刚了解了使用输入/输出。BufferedReader
我想知道这个词的确切含义是什么?Stream
Buffer
此外,这行代码还为我们提供了什么:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
我刚刚了解了使用输入/输出。BufferedReader
我想知道这个词的确切含义是什么?Stream
Buffer
此外,这行代码还为我们提供了什么:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Java 有两种用于输入和输出 (I/O) 的类:流和读取器/写入器。
流(以及扩展这些流的所有内容)用于从文件,网络或任何其他设备读取和写入二进制数据。InputStream
OutputStream
读者和作家用于阅读和写作文本(字符)。它们是流之上的一层,使用字符编码将二进制数据(字节)转换为字符并返回。
逐字节地从磁盘读取数据效率非常低。加快速度的一种方法是使用缓冲区:不是一次读取一个字节,而是一次读取几千个字节,并将它们放在缓冲区中,放在内存中。然后,您可以逐个查看缓冲区中的字节。
Oracle关于I / O的Java教程对此进行了详细解释。
查看您提供的代码行:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.in
是一个 .创建一个 从 读取字节的 。然后,将其包装在 .InputStream
InputStreamReader
System.in
BufferedReader
因此,最后,您有一个从 读取从 读取的 。BufferedReader
InputStreamReader
System.in
缓冲区:
它是物理内存存储的一个区域,用于在将数据从一个位置移动到另一个位置时临时存储数据。在大多数情况下,该物理内存存储将是RAM(随机存取内存)。
但从这个问题的上下文来看,缓冲区是在读取/写入数据时使用的。将数据从一个位置移动到另一个位置时不需要使用它。
缓冲区示例:如果您的系统有 4 GB 的 RAM,则系统可以为缓冲区分配 4 KB 的内存 (RAM)。KB - 千字节, GB - 千兆字节
I/O 流(或)流:
I/O 流表示输入源或输出目标。流可以表示许多不同类型的源和目标,包括磁盘文件、设备、其他程序和内存阵列。
I/O 表示输入/输出。
因此,输入流可以是输入源,如磁盘文件,网络连接等。
而且,输出流可以是输出目标,如磁盘文件,网络连接等。
根据JAVA官方文档,流有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 个缓冲流类用于包装未缓冲流:
要创建缓冲的字节流,请使用 和 类。BufferedInputStream
BufferedOutputStream
要创建缓冲字符流,请使用 和 类。BufferedReader
BufferedWriter