繁体   English   中英

Java中InputStream和InputStreamReader之间的区别

[英]Difference between InputStream and InputStreamReader in 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好处是什么?

什么是InputStreamInputStreamReader之间有很大的区别。 一个读取字节,而另一个读取字符。 根据所使用的编码,一个字符可能超过1个字节。

InputStream.read()

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

InputStreamReader.read()

读取单个字符。

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

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

InputStreamReaderread()方法之一的每次调用都可能导致从基础字节输入流中读取一个或多个字节。 为了实现字节到字符的有效转换,与满足当前读取操作所需的字节数相比,可以从基础流中提前读取更多字节。

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

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

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

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

对于InputStreamReader,可以使用“ char c”代替“ int c”,而可以使用“ null”代替“ -1”值。 像这样 :

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,我们需要这样做,因为它基于字节进行读取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM