InputStream vs InputStreamReader

时间:2010-07-07 13:07:50

标签: java io

使用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流数据方面。

6 个答案:

答案 0 :(得分:81)

它们代表了一些不同的东西。

InputStream是所有可能的 stream 字节的祖先类,它本身没有用,但是所有子类(比如你正在使用的FileInputStream)非常适合处理二进制数据。

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

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

答案 1 :(得分:26)

InputStreamReader用于直接读取字符。

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

这是我相信的主要区别。

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

此外,如果您正在阅读大块文本,您甚至可以将InputStreamReader包装在BufferedReader中,它为您提供了一些很好的方法,让我们一次读取整行。< / p>

这有助于你吗?

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

干杯,

答案 2 :(得分:9)

来自InputStreamReader javadoc:

  

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

对于实际包含已知编码字符的Inp​​utStreams,请使用阅读器。否则你只需要获得字节,并且必须手动转换为char'。

两种read方法之间的区别:

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

答案 3 :(得分:5)

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

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

由于这个原因,不要使用FileReader,因为它使用字符集的平台默认值,在许多情况下,这是不实际的。

答案 4 :(得分:2)

InputStream 帮助我们读取字节流 InputStreamReader 有助于使用UTF-8等其他字符集将这些字节流解码为字符流。
提高效率Java API建议使用 BufferedReader 以及 InputStream InputStreamReader

答案 5 :(得分:1)

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