首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >BufferedReader中的缓冲区大小是多少?

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

Stack Overflow用户
提问于 2011-01-09 19:54:17
回答 3查看 66.3K关注 0票数 27

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

代码语言:javascript
复制
BufferedReader(Reader in, int size)

正如我所写的程序:

代码语言:javascript
复制
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());
            }
    }
}

输出:

代码语言:javascript
复制
Enter the data to be read by the bufferedReader: Hello world and hello world again
The data is: Hello world and hello world again

那么,缓冲区大小意味着什么,正如我所预期的,它将只读取两个字符。但事实并非如此。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-09 19:58:11

顾名思义,BufferedReader会缓冲输入。这意味着在将输入源传递给您之前,它会从输入源读取数据到缓冲区。这里的缓冲区大小是指它缓冲的字节数。

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

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

票数 37
EN

Stack Overflow用户

发布于 2015-06-23 16:11:42

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

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

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

票数 14
EN

Stack Overflow用户

发布于 2011-05-30 09:45:33

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

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

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4638974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档