【问题标题】:Reading character streams in Java在 Java 中读取字符流
【发布时间】:2013-06-24 11:10:52
【问题描述】:

InputStream 类为读取字节数据提供流,而 Reader 类为字符数据提供流。 为了从流中读取字符数据,我们使用 InputStreamReader,它实际上是一个将字节流转换为字符流的桥梁。 是不是可以直接从流中读取字符数据,而不是先将其作为字节流读取,然后再转换成字符流?

【问题讨论】:

    标签: java


    【解决方案1】:

    不,不是。

    其中一个原因是,根据文件使用的字符编码,同一个字符可能用不同的字节数表示。

    é为例(注意重音):

    • 在 ISO-8859-1 中为一个字节;
    • 在 UTF-8 中,它将是两个字节;
    • 在 UTF-32 中,它将是 4 个字节!

    这就是为什么当你打开Reader时选择正确的字符编码是至关重要的(这就是Charset类在Java中的体现;另见CharsetDecoderCharsetEncoder) .

    同样的考虑适用于例如 HTTP、XML 等:所有这些技术都有一种或另一种方式来指定使用什么字符编码,以便“阅读器”能够正确读取它。

    (这甚至没有提到,根据所使用的编码,同一个字符可能由不同的字节集表示……还记得 EBCDIC 吗?)

    【讨论】:

      【解决方案2】:

      输入流读取原始字节,而字符是根据字符编码从流中派生的。

      关于你的问题,你不能直接从流中读取字符,因为没有字符,只有字节序列。你需要字符流来将字节转换为字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-21
        • 2012-12-02
        • 1970-01-01
        • 1970-01-01
        • 2015-11-01
        • 2020-03-21
        • 2014-07-15
        相关资源
        最近更新 更多