2015-08-24 31 views
1

现在,我似乎并没有得到那些流(输入/输出)和普通writerreader甚至scannerformatter之间的区别...输入/输出流与普通读写器有什么区别,它们的类型有什么区别?

及为何InputStream有很多子类像DataInputStreamBufferedInputStream和所有那些乱七八糟(与同为当然OutputStream)...

最后一两件事,如果缓冲区是很好的(所以我读)和高效为什么会任何一个使用任何其他输入/输出方式(为什么他们甚至制造?)

回答

5

Streams read/writebytes,while Readers read and Writers write character data。由于在它的下面,所有你在做I/O时总是有字节,这意味着读者和作者会对字符进行额外的步骤converting字节。

对于这两种情况(我刚刚链接的)都有抽象的超类,有不同的子类,不只是流 - 你可以在Javadoc中看到自己,每个页面都列出所有这些子类。

如果您想在处理之前先收集大量数据,缓冲区才有意义。例如,一个很好的理由是,如果您一次读取/写入大量数据,而不是单独读取/写入每个字节/字符,则磁盘访问效率更高。但是,当然,有很多不同的情况,你可能想做I/O - 不是一种尺寸,所以根据这些不同的情况有不同的类别。

完全缓冲版本的原因是面向对象编程的基本原理:通过解耦功能,您可以获得更简单的机制/设计,同时解决更广泛的可能应用,如上所述。

+0

你能举一个例子吗?将**字节**转换为**字符**,反之亦然? – Argento

+1

查看InputStreamReader和OutputStreamWriter - 它们的构造函数接受一个流对象(source/sink作为字节)和一个Charset,它具有如何在字节和字符之间映射的信息。您可以像使用任何其他读写器一样使用它们,即通过普通的'read'和'write'方法。但是,如果您只想读取/写入现有的字符数据(比如说,从磁盘读取文本文件),则不必手动执行此转换:各种Reader/Writer类在内部为您执行此操作。 – Thomas

+0

和哪个'Charset'应该使用并取决于什么? – Argento