BufferedReader 中的缓冲区大小是多少?
Posted
技术标签:
【中文标题】BufferedReader 中的缓冲区大小是多少?【英文标题】:What is the buffer size in BufferedReader? 【发布时间】:2011-06-06 01:19:35 【问题描述】:构造函数中缓冲区大小是什么意思?
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 个字节,在像您这样的情况下,这是一个合理的假设。
除非您知道自己在做什么,否则您应该使用相当大的默认缓冲区大小。缓冲区较小的一个原因是当您在内存有限的设备上运行时,因为缓冲区会消耗内存。
【讨论】:
那么缓冲区大小的意义是什么。你能解释一下吗? @codeonnitrix 添加了一些解释。让我知道这是否足够。 大小不是缓冲的字符数而不是字节数吗? Logcat 说:BufferedReader 构造函数中使用的默认缓冲区大小。如果需要 8k 字符的缓冲区,最好是明确的。什么是正确的方法? 使用 FileInputStream,缓冲区大小不会直接影响从该文件读取的系统调用计数吗?像 totalFileSize / bufferSize = 系统调用次数?因此,如果您正在逐行读取一个巨大的文件,那么将 bufferSize 设置为更高的值是有意义的,这样它可以减少系统调用。只是想,我无法从源代码中分辨出来,wdyt 吗?跨度> 【参考方案2】:http://www.docjar.com/html/api/java/io/BufferedReader.java.html
根据此 java 文档,默认缓冲区大小为 8192 个字符容量。 行大小被认为是 80 个字符的容量。
8192 缓冲区大小足以满足较小的文件大小。但这又是可增长的。如果文件包含超过 8192 个字符,则 bufferedreader 的填充方法将在从文件中读取内容之前增加缓冲区大小。对于较大的内容文件,最好在通过构造函数创建缓冲读取器时将自己的最大大小设置为缓冲区,这样您就可以避免重新创建内存并将旧数组复制到新创建的数组中。
【讨论】:
直截了当的信息。Thanks@user1923551 缓冲区实际上永远不会增长。它的大小是恒定的。从文件读取时,它仅用作内存中的中间存储。懒得解释了,看这个:***.com/questions/648309/what-does-it-mean-by-buffer @gargii 支持链接,但是在 Java BufferedReader 中,可以在构造函数中配置缓冲区大小,如new BufferedReader(Reader, size)
这样您就可以决定缓冲区的大小,不是吗?虽然默认大小 8192 通常就足够了,也很适合。【参考方案3】:
当你读或写一个文件时,你必须访问内核,内核实际上获得了对该文件的访问权。所有文件操作都必须经过内核。这是一个相当昂贵的操作。缓冲会导致读取一大块字节;它们保存在 RAM 中的一个临时位置,并且是从该位置读取的字节。这样,您就不会频繁地请求内核进行文件 IO。
如果您使用巨大的缓冲区大小,您将不必要地占用 RAM。如果您使用一个很小的,您将不断地在内核中窃听文件请求。最好允许使用默认值。您可以指定缓冲区大小和实验。大多数机器一次读取一个扇区或整数个扇区。扇区大小取决于您如何格式化您的机器。
下面的实验很有趣。制作一个包含 1,000,000 个零的文件。使用您的操作系统的计时功能来查看它复制到另一个文件的速度有多快(您将编写一个带有缓冲和非缓冲 IO 的复制程序)。使用包括默认值在内的各种缓冲区大小来计时。
【讨论】:
以上是关于BufferedReader 中的缓冲区大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章