【问题标题】:InputStream vs InputStreamReaderInputStream 与 InputStreamReader
【发布时间】:2011-03-12 19:34:50
【问题描述】:

使用InputStream 比使用InputStreamReader 有什么好处,反之亦然。

下面是InputStream 的示例:

InputStream input = new FileInputStream("c:\\data\\input-text.txt");

int data = input.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);

  data = input.read();
}
input.close();

这里是一个使用 InputStreamReader 的例子(显然是在 InputStream 的帮助下):

InputStream inputStream = new FileInputStream("c:\\data\\input.txt");
Reader      reader      = new InputStreamReader(inputStream);

int data = reader.read();
while(data != -1){
    char theChar = (char) data;
    data = reader.read();
}

reader.close();  

Reader 是否以特殊方式处理数据?

只是想了解一下 Java 中的整个 i/o 流数据方面。

【问题讨论】:

  • 请注意,在构造InputStreamReader 时指定字符集编码通常是个好主意。如果你把它排除在外,那么它将选择以正确方式配置的任何编码(如果这是你想要的,那么明确地写出来)。

标签: java io


【解决方案1】:

如果要读取二进制数据,请使用 InputStream。

如果要从二进制流中读取字符串,请使用 InputStreamReader。它的构造函数之一允许您指定字符集。

因此,请勿使用 FileReader,因为它使用平台默认字符集,这在许多情况下并不实用。

【讨论】:

    【解决方案2】:

    InputStreamReader是用来直接读取字符的。

    因此将它们读取为 int 然后转换为 char 并不是最佳选择。

    这是我认为的主要区别。

    InputStream 为您提供字节,InputStreamReader 已为您提供字符,因此它一次读取 InputStream 8 位。

    此外,如果您正在阅读大量文本,您甚至可以将 InputStreamReader 包裹在 BufferedReader 中,这为您提供了一些不错的方法,比如一次阅读整行。

    这对你有帮助吗?

    您也可以阅读这篇文章:https://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

    干杯,

    【讨论】:

    • 是的,这是有道理的。有没有办法指定一个缓冲区,以便一次读取超过 1 个字节 - 例如我希望它一次读取 1024 个字节。
    • 嗨,如果您使用 BufferedReader,您可以根据 Javadoc“BufferedReader(Reader in, int sz)”定义缓冲区的大小。但是,对于 InputStreamReader,我相信这一次只能准备 1 个字节。你无法改变它。
    【解决方案3】:

    它们代表的东西有些不同。

    InputStream 是所有可能的字节 的祖先类,它本身没有用,但所有子类(如您正在使用的FileInputStream)都很好处理二进制数据。

    另一方面,InputStreamReader(及其父 Reader)专门用于处理字符(如字符串),因此它们可以优雅地处理字符集编码(utf8、iso-8859-1 等) .

    简单的答案是:如果您需要二进制数据,您可以使用InputStream(也可以使用特定的DataInputStream),如果您需要处理文本,请使用InputStreamReader..

    【讨论】:

      【解决方案4】:

      来自 InputStreamReader javadoc:

      将字节流转换为的类 一个字符流。从读取的数据 源输入流被转换成 默认字符或 提供字符转换器。这 默认编码取自 “file.encoding”系统属性。 {@code InputStreamReader} 包含一个 从源读取的字节缓冲区 流并将这些转换为 根据需要使用字符。

      对于实际上包含已知编码的字符的 InputStream,请使用阅读器。否则,您只需获取字节,就必须“手动”转换为 char。

      read这两种方法的区别:

      InputStream::read 读取单个byte 并将其作为int 返回,而InputStreamReader::read 读取单个char(尊重编码)并将其作为int 返回。

      【讨论】:

        【解决方案5】:

        InputstreamReader 用于读取输入流中无法读取的 Unicode 数据。

        【讨论】:

          【解决方案6】:

          InputStream 帮助我们读取字节流
          InputStreamReader 帮助我们使用 UTF-8 等字符集将这些字节流解码为字符流
          但是为了提高效率,Java API 建议同时使用 BufferedReader 以及 InputStreamInputStreamReader

          【讨论】:

            猜你喜欢
            • 2014-04-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-28
            • 2016-06-18
            • 1970-01-01
            • 1970-01-01
            • 2011-12-20
            相关资源
            最近更新 更多