现在,我似乎无法区分这些流(输入/输出)与普通writer
和reader
甚至scanner
和{{1}之间的区别} ...
为什么formatter
有很多子类,如InputStream
和DataInputStream
以及所有混乱(当然BufferedInputStream
也是如此)...
最后一件事,如果缓冲区那么好(所以我读)并且效率高,为什么任何人都会使用任何其他输入/输出方式(为什么他们甚至制作了?)
答案 0 :(得分:5)
Streams read / write bytes ,而Readers读取,Writers写字符数据。因为在它下面所有你做I / O时总是有字节,这意味着读者和作者对字符执行converting个字节的额外步骤。
两种情况都有抽象的超类(我刚刚链接的那些),有各种子类,不仅仅是流 - 你可以在Javadoc中看到自己,每个页面都列出了所有这些的子类。
如果您想在处理之前先收集大量数据,那么缓冲区就有意义了。例如,一个很好的理由是,如果您一次读取/写入一大块数据,而不是单独读取/写入每个字节/字符,则磁盘访问会更有效。但是,当然,有很多不同的情况你可能想要进行I / O - 不是一种尺寸适合所有情况,因此有针对这些不同情况的不同类别。
完全缓冲版本的原因是面向对象编程的基本原则:通过解耦功能,您可以获得不太复杂的机制/设计,同时解决更广泛的可能应用,如上所述。