使用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
流数据方面。
答案 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}包含一个 从源读取的字节缓冲区 流并将这些转换为 根据需要填写字符。
对于实际包含已知编码字符的InputStreams,请使用阅读器。否则你只需要获得字节,并且必须手动转换为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数据。