有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java I/O中,“流”和“缓冲区”到底意味着什么?

我刚刚学习了使用BufferedReader进行输入/输出

我想知道StreamBuffer的确切含义是什么

这一行代码为我们提供了什么服务:

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

共 (5) 个答案

  1. # 1 楼答案

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

    术语“输入/输出”的意思就是将数据移入和移出缓冲区。一直记住这一点。进程通过请求操作系统从缓冲区中释放数据(写操作)或用数据填充缓冲区(读操作)来执行I/O
    Logical Diagram of how data moves

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

    为了更好地理解,你可以阅读这些链接。希望有帮助
    What is buffer in Java
    enter link description here

  2. # 2 楼答案

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

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

  3. # 3 楼答案

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

    现在我们来排队

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

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

    所以,即使在开始读取之前,bufferedReader也会在寄存器中存储一些字节块,当您执行读取操作时。它将从该位置读取,这比从控制台/文件读取成本低得多,但在InputStreamReader的情况下,每次执行磁盘访问操作时都会执行读取操作

  4. # 4 楼答案

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

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

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

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

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

    查看您提供的代码行:

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

    System.in是一个InputStream。创建一个InputStreamReader,从System.in读取字节。然后用BufferedReader包装

    最后,你有一个BufferedReader从一个InputStreamReader读取System.in

  5. # 5 楼答案

    缓冲区:

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

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

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

    I/O Stream(或)流:

    I/O Stream represents an input source or an output destination. A stream can represent many different kinds of sources and destinations, including disk files, devices, other programs, and memory arrays.

    I/O表示输入/输出

    所以,输入流可以是一个输入源,比如磁盘文件、网络连接等

    而且,输出流可以是一个输出目的地,如磁盘文件、网络连接等

    根据JAVA official documentation,流有三种类型

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

    字节流:

    They perform input and output of 8-bit bytes. All byte stream classes are descended from InputStream and OutputStream.

    字节输入流类以原始字节的形式获取输入。 字节输出流类以原始字节的形式提供输出

    InputStream-直接已知子类

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

    OutputStream-直接已知子类

    ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
    

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

    All character stream classes are descended from Reader and Writer.

    Reader-直接已知子类

    BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
    

    Writer-直接已知子类

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

    字节流&;字符流使用无缓冲I/O

    This means each read or write request is handled directly by the underlying OS. This can make a program much less efficient, since each such request often triggers disk access, network activity, or some other operation that is relatively expensive. To reduce this kind of overhead, the Java platform implements buffered I/O streams.

    缓冲流:

    Buffered input streams read data from a memory area known as a buffer; the native input API is called only when the buffer is empty.

    Similarly, buffered output streams write data to a buffer, and the native output API is called only when the buffer is full.

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

    例如:

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

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

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

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