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