InputStream与InputStreamReader
在InputStreamReader
上使用InputStream
有什么好处,反之亦然。
这里是一个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中的整个i/o
stream数据方面。
他们代表了不同的东西。
InputStream
是所有可能的字节stream的祖先类,它本身是没有用的,但是所有的子类(比如你正在使用的FileInputStream
)对于处理二进制数据是很好的。
在对应的InputStreamReader
(及其父Reader
)专门用于处理字符(所以string),所以他们处理字符集编码(utf8,iso-8859-1等)。
简单的答案是:如果你需要二进制数据,你可以使用InputStream
(也可以是DataInputStream
这样的特定的数据),如果你需要使用InputStreamReader
来处理文本。
那么InputStreamReader
是用来直接读取字符。
所以阅读他们作为整数,然后转换为字符不是真正的最佳。
这是我相信的主要区别。
InputStream
给你的字节, InputStreamReader
给你已经是字符,所以它一次读取InputStream
8bits。
另外,如果你正在阅读大块的文本,你甚至可以把InputStreamReader
包装到一个BufferedReader
,这个BufferedReader
提供了一些很好的方法来让我们一次读完整行。
这帮助你?
干杯,
来自InputStreamReader javadoc:
将字节stream转换为字符stream的类。 从源inputstream中读取的数据通过默认或提供的字符转换器转换为字符。 默认编码取自“file.encoding”系统属性。 InputStreamReader包含从源stream中读取的字节缓冲区,并根据需要将它们转换为字符。
对于实际包含已知编码中的字符的InputStream,请使用阅读器。 否则,你只是得到的字节,将不得不做手工转换为char'。
两种read
方法的区别:
InputStream::read
读取单个byte
并将其作为int
返回,而InputStreamReader::read
读取单个char
(尊重编码),并将其作为int
返回。
如果要使用InputStream读取二进制数据。
如果您想从二进制stream中读取string,请使用InputStreamReader。 它的一个构造函数允许你指定一个字符集。
由于这个原因,不要使用FileReader,因为它使用字符集的平台默认值,在很多情况下,这是不实际的。
InputstreamReader用于读取inputstream中不能读取的Unicode数据。
InputStream帮助我们读取字节stream
而 InputStreamReader可以帮助用UTF-8或其他字符集将字节stream解码为字符stream。
但为了提高效率,Java APIbuild议使用BufferedReader以及InputStream和InputStreamReader