IT-Swarm.Net

InputStream vs InputStreamReader

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

53
xil3

它们代表了不同的东西。.

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

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

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

81
Jack

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

那么InputStreamReader用于直接读取字符。.

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

这是我认为的主要区别。.

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

另外,如果您正在阅读大块文本,您甚至可以将InputStreamReader包装在BufferedReader中,它为您提供了一些Nice方法,让我们一次读取整行。.

这有助于你吗?

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

干杯,

26
Trefex

来自InputStreamReader javadoc:

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

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

两个read方法之间的区别:

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

9
Andreas_D

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

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

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

5
Alexander Pogrebnyak

InputStream 帮助我们读取字节流
InputStreamReader 使用一些字符集(如UTF-8或其他字符串)帮助将这些字节流解码为字符流。.
但是 为了提高效率,Java API建议使用 BufferedReader 还有 InputStream InputStreamReader

2
AbSak-The Humble Learner

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

1
Asthme