【问题标题】:What's the difference between input/output streams and ordinary reader and writer and what's the difference between their types?输入/输出流和普通读写器有什么区别,它们的类型有什么区别?
【发布时间】:2015-11-18 02:03:27
【问题描述】:

现在我似乎不明白这些流(输入/输出)与普通的 writerreader 甚至 scannerformatter 之间的区别...

为什么InputStream 有很多子类,如DataInputStreamBufferedInputStream 以及所有这些混乱(当然OutputStream 也是如此)...

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

【问题讨论】:

    标签: java inputstream outputstream writer reader


    【解决方案1】:

    read/write字节,而Readers读取和Writers写入字符数据。因为在这一切之下,在执行 I/O 时总是有字节,这意味着读取器和写入器执行额外的步骤,将 converting 字节转换为字符。

    这两种情况都有抽象超类(我刚刚链接的那些),还有各种子类,而不仅仅是流——您可以在 Javadoc 中亲自查看,每个页面都列出了所有这些的子类。

    如果您想在处理之前先收集一大块数据,则缓冲区是有意义的。一个很好的理由是,例如,如果您一次读取/写入一大块数据,而不是单独读取/写入每个字节/字符,那么磁盘访问效率会更高。但是,当然,您可能希望在许多不同的情况下进行 I/O —— 不是一种适合所有情况的,因此有针对这些不同情况量身定制的不同类。

    制作缓冲版本的根本原因是面向对象编程的基本原则:通过解耦功能,您可以获得不太复杂的机制/设计,同时解决更广泛的可能应用程序,如上所述。

    【讨论】:

    • 你能举个例子,把 bytes 转换成 characters 反之亦然吗?
    • 查看InputStreamReaderOutputStreamWriter——它们的构造函数采用一个流对象(字节的源/接收器)和一个Charset,其中包含如何在字节和字符之间映射的信息。您可以像使用任何其他读取器/写入器一样使用它们,即通过普通的 readwrite 方法。但是,如果您只想读取/写入现有字符数据(例如,从磁盘读取文本文件),则不必手动进行此转换:各种 Reader/Writer 类在内部为您完成。
    • 应该使用哪个Charset,取决于什么?
    • 这取决于任务:如果您要写入字符数据(“编码”),您应该确保Charset 包含所有字节的映射数据中包含的(特殊)字符。如果您要读取 数据(“解码”),则应使用写入数据时用于对数据进行编码的Charset。目前使用的标准字符集包括UTF-8ISO-8859-1US-ASCII——查看Charset 的Javadoc 了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 2014-09-14
    • 2016-04-20
    • 1970-01-01
    • 2011-02-25
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    相关资源
    最近更新 更多