InputStream vs InputStreamReader

xil*_*il3 53 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();
Run Code Online (Sandbox Code Playgroud)

这是一个使用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();  
Run Code Online (Sandbox Code Playgroud)

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

试着让我了解i/oJava中的整个流数据方面.

Jac*_*ack 84

它们代表了不同的东西.

InputStream是所有可能的字节的祖先类,它本身没有用,但是所有子类(就像FileInputStream你正在使用的那样)都非常适合处理二进制数据.

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

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


Tre*_*fex 27

InputStreamReader用于直接读取字符.

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

这是我认为的主要区别.

InputStream给你字节,并InputStreamReader给你已经字符,所以它一次读取8 InputStream位.

另外,如果您正在阅读大块文本,您甚至可以将其包装InputStreamReader在一个BufferedReader为您提供一些不错的方法,让我们一次读取整行.

这有助于你吗?

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

干杯,


And*_*s_D 9

来自InputStreamReader javadoc:

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

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

两种read方法的区别:

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


Ale*_*yak 5

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

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

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