【问题标题】:Difference between InputStream and InputStreamReader in javajava中InputStream和InputStreamReader的区别
【发布时间】:2016-02-04 10:20:29
【问题描述】:

我读到 InputStream 用于基于字节的读取,它一次读取 1 个字节。 InputStreamReader 用于基于字符的读取,因此它一次读取一个字符,因此无需先将其转换为 int 然后读取它。

这里是使用 InputStream 读取。

 InputStream input=new FileInputStream("D:/input.txt");

 int c;

 while((c=input.read())!=-1)
 {
    System.out.print((char)c);
 }

这里是使用 InputStreamReader 读取

InputStream input=new FileInputStream("D:/input.txt");

reader=new InputStreamReader(input,"UTF-8");

int c;

while((c=reader.read())!=-1)
{
    System.out.print((char)c);
}

InputStreamInputStreamReader 有什么区别?在这两种情况下,我都必须使用int,然后读取它,最后如果我想打印该数据,我必须使用“(char)c”进行转换。

那么使用InputStreamReader 有什么好处呢?

【问题讨论】:

  • 不同之处在于InputStream 本身不会处理大于127 的输入值。尝试在您的测试输入中添加一些中文字符,它们将在InputStream 版本中打印为两个字节.

标签: java


【解决方案1】:

InputStreamInputStreamReader 之间存在很大差异。一个读取字节,而另一个读取字符。根据使用的编码,一个字符可能超过 1 个字节。

来自InputStream.read()

从输入流中读取下一个字节的数据

来自InputStreamReader.read()

读取单个字符。

InputStreamReader 在 Java 中充当这两种读取数据的方式之间的桥梁:一种将字节流桥接到字符流的方式。 From its Javadoc:

InputStreamReader 是从字节流到字符流的桥梁:它读取字节并使用指定的字符集将它们解码为字符。它使用的字符集可以由名称指定,也可以明确给出,或者可以接受平台的默认字符集。

InputStreamReaderread() 方法之一的每次调用都可能导致从底层字节输入流中读取一个或多个字节。为了实现字节到字符的有效转换,可以从底层流中预先读取比满足当前读取操作所需的更多的字节。

【讨论】:

  • 感谢您的回答,但如果是这种情况,那么为什么两者都返回相同的输出。在使用 System.out.println(c) 显示输出时,我得到了相同的输出。你能举个例子,这样我就可以看到实际的区别。
  • @user3387084 尝试阅读中文文本 ;),你会看到不同的。
  • 感谢@user3387084,所以基本上 InputStreamReader 应该用于像“UTF-16”这样的编码。对吗?
  • @user3387084 不,InputStreamReader 应该在您想使用某种编码读取字符时使用。例如,使用 UTF-8,您可以使用 Reader 一次读取一个汉字。但是,当您特别想读取数据的每个字节时,需要使用InputStream
  • 感谢@Tunaki 的解释,我一直在摸不着头脑。现在一切都清楚了 :)
【解决方案2】:

某些编码具有跨越多个字节的字符。通过使用 InputStream 读取,您正在愚蠢地读取下一个字节,而不是 InputStreamReader 可能会根据需要提前读取以便为您提供下一个 character 而不是字节。换句话说,假设您有 0x00 0xA7 作为流中接下来的两个字节。 InputStream 将在第一次读取时为您提供 0x0,然后在下一次读取时为您提供 0xA7。具有 unicode 编码的 InputStreamReader 将在第一次读取时返回 0x00A7,即字符 §。

请注意,在大多数情况下,最好使用 BufferedReader 包装 InputStreamReader。

【讨论】:

    【解决方案3】:

    InputStream 通常总是连接到某些数据源,例如文件、网络连接、管道等。Java IO 概述文本中也对此进行了更详细的说明。

    InputStreamReader 接受一个输入流,并在您阅读时将字节 Strem 转换为字符。例如,一些 UTF 字符是 2 个字节,调用输入流阅读器将读取这两个字节并自动将其转换为字符。用于读取文本流。

    【讨论】:

      【解决方案4】:

      在 InputStreamReader 的情况下,您可以使用“char c”代替“int c”,并且可以使用“null”代替“-1”值。像这样:

      InputStream input=new FileInputStream("D:/input.txt");
      
      reader=new InputStreamReader(input,"UTF-8");
      
      char c;
      
      while((c=reader.read())!=null)
      {
      System.out.print(c);
      }
      

      因为您正在使用 InputStreamReader 进行基于字符的阅读。 因此,无需设置数据类型“int”,然后使用“char”进行转换,这是不必要的。 我们需要在 InputStream 的情况下执行此操作,因为它执行基于字节的读取。

      【讨论】:

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