java中InputStream和InputStreamReader之间的区别

时间:2016-02-04 10:20:30

标签: java

我读到InputStream用于基于字节的读取,它一次读取1个字节。 并且InputStreamReader用于基于字符的读取,因此它一次读取一个字符,因此无需先将其转换为int然后读取它。

这是使用InputStream进行读取。

 InputStream input=new FileInputStream("D:/input.txt");

 int c;

 while((c=input.read())!=-1)
 {
    System.out.print((char)c);
 }

这里是使用InputStreamReader

进行读取
InputStream input=new FileInputStream("D:/input.txt");

reader=new InputStreamReader(input,"UTF-8");

int c;

while((c=reader.read())!=-1)
{
    System.out.print((char)c);
}

InputStreamInputStreamReader之间有什么区别?在这两种情况下,我都必须使用int,然后阅读它,如果我想打印那些数据,我必须使用“(char)c”进行转换。

那么使用InputStreamReader有什么好处?

4 个答案:

答案 0 :(得分:6)

InputStreamInputStreamReader之间存在很大差异。一个读取字节,而另一个读取字符。根据使用的编码,一个字符可能超过1个字节。

来自InputStream.read()

  

从输入流中读取下一个数据字节

来自InputStreamReader.read()

  

读取单个字符。

InputStreamReader充当了Java中读取数据的两种方式之间的桥梁:一种将字节流桥接到字符流的方法。 From its Javadoc

  

InputStreamReader是从字节流到字符流的桥接:它使用指定的字符集读取字节并将其解码为字符。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。

     

每次调用InputStreamReader的{​​{1}}方法之一都可能导致从基础字节输入流中读取一个或多个字节。为了能够有效地将字节转换为字符,可以从基础流中提取比满足当前读取操作所需的更多字节。

答案 1 :(得分:0)

某些编码包含跨越多个字节的字符。通过使用InputStream读取,您可能会愚蠢地读取下一个字节而不是InputStreamReader,它可以根据需要提前读取,以便为您提供下一个字符而不是字节。换句话说,假设你有0x00 0xA7作为流的下两个字节。 InputStream在第一次读取时会给你0x0,然后在下一次读取时会给你0xA7。具有unicode编码的InputStreamReader将在第一次读取时返回0x00A7,即字符§。

请注意,在大多数情况下,最好使用BufferedReader包装InputStreamReader。

答案 2 :(得分:0)

InputStream 通常始终连接到某些数据源,如文件,网络连接,管道等。这在Java IO概述文本中也有详细说明。

InputStreamReader 接受输入流,并在读取时将字节Strem转换为字符。例如,一些UTF字符是2个字节,对输入流读取器的调用将读取两个字节并自动将其转换为字符。它用于读取文本流。

答案 3 :(得分:0)

在InputStreamReader的情况下,您可以使用'char c'代替'int c'而不是'-1'值,您可以使用'null'。像这样:

InputStream input=new FileInputStream("D:/input.txt");

reader=new InputStreamReader(input,"UTF-8");

char c;

while((c=reader.read())!=null)
{
System.out.print(c);
}

因为您正在使用InputStreamReader进行基于字符的阅读。  因此,不需要设置数据类型'int'然后使用'char'来强制转换它,这是不必要的。 我们需要在InputStream的情况下执行此操作,因为它执行基于字节的读取。