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

构造函数中缓冲区大小的含义是什么?

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 

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

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

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

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

当您在文件中读取或写入时,您必须访问内核,该内核实际上可以访问该文件。 所有文件操作都必须通过内核。 这是一项相当昂贵的操作。 缓冲导致读取一块字节; 它们保存在RAM中的临时位置,并从该位置读入字节。 通过这种方式,您不会经常请求内核执行文件IO。

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

以下实验很有趣。 创建一个包含1,000,000个零的文件。 使用操作系统的计时function查看将其复制到另一个文件的速度(您将编写具有缓冲和无缓冲IO的复制程序)。 使用各种缓冲区大小计算时间,包括默认值。

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

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

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