Java InputStream与InputStreamReader

Java InputStream与InputStreamReader,java,io,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 =

使用
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的帮助下):

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


我只是想了解一下Java中的整个
i/o
流数据方面。

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

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


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

好的
InputStreamReader
用于直接读取字符

因此,将它们读取为int,然后转换为char并不是最理想的

这是我认为的主要区别

InputStream
为您提供字节,而
InputStreamReader
为您提供已存在的字符,因此它一次读取
InputStream
8个字节

此外,如果您正在阅读大量文本,您甚至可以将
InputStreamReader
包装在
BufferedReader
中,这为您提供了一些很好的方法,比如说一次阅读整行内容

这对你有帮助吗

您还可以阅读本文:


干杯,它们代表着不同的东西

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

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


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

来自InputStreamReader javadoc:

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

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

两种
read
方法之间的差异:


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

的形式返回该值。InputstreamReader用于读取在inputstream中无法读取的Unicode数据。

inputstream帮助我们读取字节流
然而,InputStreamReader使用UTF-8或其他字符集帮助将这些字节流解码为字符流。

但是为了提高效率,Java API建议同时使用BufferedReader以及InputStreamInputStreamReader

是的,这是有意义的。有没有一种方法可以指定一个缓冲区,使它一次读取超过1字节的数据——比如说,我希望它一次读取1024字节。嗨,如果你使用BufferedReader,你可以根据Javadoc“BufferedReader(Reader in,int sz)”定义缓冲区的大小。然而,对于InputStreamReader,我相信它一次只能准备1个字节。您无法更改此设置。请注意,在构造
InputStreamReader
时,通常最好指定字符集编码。如果不使用它,那么它将选择以正确方式配置的任何编码(如果这是您想要的,那么显式地编写它)。
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();