BufferedReader 中的缓冲区大小是多少?

2022-09-01 15:10:30

构造函数中的缓冲区大小是什么意思?

BufferedReader(Reader in, int size)

正如我所写的程序:

import java.io.*;
class bufferedReaderEx{
    public static void main(String args[]){
        InputStreamReader isr = null;
        BufferedReader br = null;
            try{
                isr = new InputStreamReader(System.in);
//              System.out.println("Write data: ");
//              int i = isr.read();
//              System.out.println("Data read is: " + i);
                //Thus the InputStreamReader is useful for reading the character from the stream
                System.out.println("Enter the data to be read by the bufferedReader: ");
                //here isr is containing the lnefeed already so this is needed to be flushed.
                br = new BufferedReader(isr, 2);
                String str = br.readLine();
                System.out.println("The data is : :" +  str);
            }catch(IOException e){
                System.out.println("Can't read: " + e.getMessage());
            }
    }
}

输出:

Enter the data to be read by the bufferedReader: Hello world and hello world again
The data is: Hello world and hello world again

然后缓冲区大小意味着什么,因为我打算它只读取两个字符。但事实并非如此。


答案 1

BufferedReader缓冲输入,顾名思义。这意味着它会先从输入源读取到缓冲区中,然后再将其传递给您。此处的缓冲区大小是指它缓冲的字节数。

从大多数来源读取输入非常慢。只有2个字节的缓冲区会损害性能,因为您的程序很可能大部分时间都在等待输入。缓冲区大小为 2 时,读取 100 个字节将导致从内存中缓冲区读取 2 个字节(非常快),填充缓冲区(非常慢),从缓冲区读取 2 个字节(非常快),填充缓冲区(非常慢)等 - 总体上非常慢。缓冲区大小为 100 时,读取 100 字节将导致从内存中缓冲区读取 100 个字节(非常快) - 总体上非常快。这是假设缓冲区在读取时包含100个字节,在像您这样的情况下,这是一个合理的假设。

除非您知道自己在做什么,否则应使用非常大的默认缓冲区大小。缓冲区较小的一个原因是在内存有限的设备上运行时,因为缓冲区会消耗内存。


答案 2

http://www.docjar.com/html/api/java/io/BufferedReader.java.html

根据此 java 文档,默认缓冲区大小为 8192 个字符的容量。行大小被视为 80 个字符的容量。

8192 缓冲区大小足以满足较小的文件大小。但同样,这是可以增长的。如果文件包含的字符超过 8192 个,则缓冲区读取器的填充方法将在从文件中读取内容之前增加缓冲区大小。对于较大的内容文件,最好在通过构造函数创建缓冲读取器时将自己的最大大小设置为缓冲区,这样可以避免重新创建内存并将旧数组复制到新创建的数组中。


推荐