27

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

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

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

4

3 回答 3

37

BufferedReader正如名字所说,缓冲输入。这意味着它在将输入源传递给您之前将其从输入源读取到缓冲区中。这里的缓冲区大小是指它缓冲的字节数。

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

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

于 2011-01-09T11:58:10.963 回答
14

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

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

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

于 2015-06-23T08:11:41.750 回答
11

当您读取或写入文件时,您必须访问内核,内核实际上获得了对该文件的访问权限。所有文件操作都必须经过内核。这是一个相当昂贵的操作。缓冲会导致读取一大块字节;它们保存在 RAM 中的一个临时位置,并且是从该位置读取的字节。这样,您就不会频繁地请求内核进行文件 IO。

如果您使用巨大的缓冲区大小,您将不必要地占用 RAM。如果您使用一个很小的,您将不断地在内核中窃听文件请求。最好允许使用默认值。您可以指定缓冲区大小和实验。大多数机器一次读取一个扇区或整数个扇区。扇区大小取决于您如何格式化您的机器。

下面的实验很有趣。制作一个包含 1,000,000 个零的文件。使用您的操作系统的计时功能来查看它复制到另一个文件的速度有多快(您将编写一个带有缓冲和非缓冲 IO 的复制程序)。使用包括默认值在内的各种缓冲区大小来计时。

于 2011-05-30T01:45:32.697 回答