缓冲区读取器的默认缓冲区大小是多少?

11
根据文档BufferedReader(Reader)使用默认缓冲区大小,而第二个构造函数BufferedReader(Reader, int)允许设置缓冲区大小。

public BufferedReader(Reader in)

创建一个使用默认大小输入缓冲区的缓冲字符输入流。

然而,文档没有提到默认缓冲区大小是多少。

BufferedReader的默认缓冲区大小是多少?


BufferedReader 可能会引起您的兴趣。 - Smit
@Vulcan EJP 给你了错误的答案。就像我所说,我已经提取了包含 BufferedReader 的实际 .jar 并查看了它。也许在一些年份里它是另一种方式,或者将来会有变化,但现在在 java.io.BufferedReader 中严格指定为 8192! - IAM
@Vulcan Android只是文档的一个例子,实际证明稍后会跟进。但由于Android也使用rt.jar,因此文档已经足够了。 - IAM
@IAM 我没有给出错误的答案。我说它(a)是未指定的,(b)在Oracle/Sun代码中已经有4096年了。他们可以随时更改它因为它是未指定的。 - user207421
4个回答

11
默认缓冲区大小为8192个字符。

http://developer.android.com/reference/java/io/BufferedReader.html

 BufferedReader(Reader in)
Constructs a new BufferedReader, providing in with a buffer of 8192 characters.
除了这份文档,我还提取了rt.jar归档文件,并使用JD-GUI反编译了java.io.*中的BufferedReader.class,以下是类定义中的内容:
private static int defaultCharBufferSize = 8192;

1
你可能是对的,但是官方文档并没有这么说:http://docs.oracle.com/javase/7/docs/api/ - 7stud
@7stud,请查看我评论中提供的链接。 - Smit
1
@Smit,回复你:看一下我评论中的Oracle链接。 - 7stud
1
虽然官方文档没有提到这一点,但我刚刚查看了源代码,确实是8192。谢谢。 - FThompson
这是Android的默认设置。OP没有提到Android。在Oracle JDK中有所不同。而且两者都没有记录。 - user207421
显示剩余4条评论

2

这并没有具体规定,这是故意的。在Sun/Oracle Java JDK中已经有4096个字符的限制了,但不要依赖它。


可能会与平台相关,但在当前的Android上是8192(请参阅https://github.com/google/j2objc/blob/master/jre_emul/android/libcore/luni/src/main/java/java/io/BufferedInputStream.java#L44)。 - pevik
@Pevik,你的链接是指BufferedInputStream,而问题是关于BufferedReader的。 - user207421

1
答案是8 KB。
1024字节*8=8192(8 KB) 参考类:java.io.BufferedReader
private static int defaultCharBufferSize = 8192;

1

我确信我认为这可能与系统/JVM有关。运行此程序:

旧的和奇特JVM上java.io.BufferedInputStream的默认缓冲区大小是多少?

import java.io.BufferedInputStream;
import java.io.InputStream;

public class BufferSizeDetector extends BufferedInputStream {
    public static void main(String[] args) {
        BufferSizeDetector bsd = new BufferSizeDetector(null);

        System.err.println(System.getProperty("java.version"));
        System.err.println(bsd.getBufferSize());
    }

    public BufferSizeDetector(InputStream in) {
        super(in);
    }

    public int getBufferSize() {
        return super.buf.length;
    }
}

我得到:
1.6.0_45
8192

3
有趣,但是什么保证BufferedReaderBufferedInputStream具有相同的默认缓冲区大小? - FThompson
@Vulcan,说得好。 (愚蠢的BufferedReader类没有buf字段)。 - 7stud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接