InputStream与InputStreamReader的区别

62

使用InputStreamInputStreamReader有什么优点,或者反过来呢?

这里是一个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();  

读取器是否以特殊方式处理数据?

我只是试图理解Java中整个数据流方面。


2
请注意,在构造InputStreamReader时指定字符集编码通常是一个好主意。如果你不指定,它将采用任何以正确方式配置的编码(如果这正是您想要的,请明确指定)。 - Tom Hawtin - tackline
6个回答

91

它们代表着不同的东西。

InputStream 是所有可能的字节流的祖先类,它本身并不实用,但其子类(例如所使用的 FileInputStream )非常适合处理二进制数据。

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

简而言之,如果您需要处理二进制数据,则可以使用 InputStream (也可以使用特定的类,如 DataInputStream ),如果需要处理文本,请使用 InputStreamReader


33

InputStreamReader 用于直接读取字符。

因此,将它们作为int读取,然后转换为char并不是最优的方法。

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

InputStream 给你字节,而 InputStreamReader 直接给你字符,所以它会一次读取 InputStream 的8位。

另外,如果你要读取大量文本,甚至可以将 InputStreamReader 包装在 BufferedReader 中,这样就可以使用一些很好的方法来一次读取整行。

这对你有帮助吗?

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

祝好!


是的,这很有道理。有没有办法指定一个缓冲区,以便一次读取多于1个字节 - 比如说我想一次读取1024个字节。 - xil3
嗨,如果您使用BufferedReader,您可以根据Javadoc定义缓冲区的大小"BufferedReader(Reader in, int sz)"。但是,对于InputStreamReader,我认为它一次只能读取1个字节。您无法更改它。 - Trefex

12

根据InputStreamReader的javadoc:

这是一个将字节流转换为字符流的类。从源输入流中读取的数据会通过默认或提供的字符转换器转换为字符。默认编码取自"file.encoding"系统属性。InputStreamReader包含了从源流中读取的字节缓冲区,根据需要将它们转换为字符。

对于实际包含已知编码字符的InputStreams,请使用reader,否则你只能获得字节并且必须手动将其转换为char。

两个read方法之间的区别:

InputStream::read读取单个字节并将其作为int返回,而InputStreamReader::read读取单个字符(遵循编码)并将其作为int返回。


6

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

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

因此,请勿使用FileReader,因为它使用平台默认的字符集,这在许多情况下并不实用。


2

InputStream 可以帮助我们读取字节流,
InputStreamReader 则可以使用某些字符集(如 UTF-8 或其他字符集)将这些字节流解码为字符流。
但是,为了提高效率,Java API 建议同时使用 BufferedReaderInputStreamInputStreamReader


1

InputstreamReader用于读取Unicode数据,这些数据在inputstream中无法读取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接