【发布时间】:2011-09-07 08:42:09
【问题描述】:
我仍在学习 Java 中的面向对象编程。我正在查看java.io.Reader.skip 的Java 实现,我想知道为什么它是这样实现的。特别是我对我注意到的这些事情有疑问:
-
skip(long)使用的缓冲区是 Reader 对象的一个字段,而不是方法中的普通变量。 - 最大缓冲区长度远小于
Integer.MAX_VALUE2147,483,647。特别是,Java 的实现使用了 8192。 -
java.io.InputStream以完全相同的方式实现跳过。
现在,我个人认为缓冲区是一个字段的原因是,缓冲区不必因为反复重新初始化而反复被垃圾收集。这可能会加快跳跃速度。
我认为缓冲区长度变小与使 Reader 阻塞的时间更短有关,但由于 Reader 是同步的,这真的会有所不同吗?
字节流以相同的方式实现它,可能是为了保持一致性。我对这三件事的假设是否正确?
总而言之,我的问题是:对于字符数组,使用字段而不是变量平均会产生多大的速度差异?使用Integer.MAX_VALUE 作为最大缓冲区长度不是一样吗?因为其他read 方法只调用无参数read,所以在for 循环中为字节流使用无参数read 方法不是更好更容易吗?
对不起,如果我的问题是一个奇怪的问题,但我认为通过这个问题我可以学到很多关于面向对象编程的知识。
【问题讨论】:
-
较小缓冲区的原因是为了减少消耗的内存量。如果缓冲区为 2 GB,它会将 2 GB 读入内存,然后将其刷新到流写入的任何位置,而不是像 8K 这样更小的缓冲区。
-
@vcsjones 我明白了 =) 这确实有道理。非常感谢。这就解释了缓冲区大小正好是 8k。我必须记住,一个字符在内存中消耗一个字节,但我想我还在学习^_^;
标签: java stream character java-io