我读到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);
}
InputStream
和InputStreamReader
之间有什么区别?在这两种情况下,我都必须使用int
,然后阅读它,如果我想打印那些数据,我必须使用“(char)c”进行转换。
那么使用InputStreamReader
有什么好处?
答案 0 :(得分:6)
InputStream
和InputStreamReader
之间存在很大差异。一个读取字节,而另一个读取字符。根据使用的编码,一个字符可能超过1个字节。
从输入流中读取下一个数据字节
读取单个字符。
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的情况下执行此操作,因为它执行基于字节的读取。