Java InputStreamReader
Java InputStreamReader类java.io.InputStreamReader包装了Java InputStream,从而将基于字节的InputStream转换为基于字符的Reader。换句话说,Java" InputStreamReader"将" InputStream"的字节解释为文本而不是数字数据。 JavaInputStreamReader
类因此是Java Reader类的子类。
Java" InputStreamReader"通常用于从文件(或者网络连接)中读取字符,其中字节表示文本。例如,一个字符编码为UTF-8的文本文件。我们可以使用InputStreamReader来包装FileInputStream以便读取此类文件。
Java InputStreamReader示例
这是一个JavaInputStreamReader
示例:
InputStream inputStream = new FileInputStream("c:\data\input.txt"); Reader inputStreamReader = new InputStreamReader(inputStream); int data = inputStreamReader.read(); while(data != -1){ char theChar = (char) data; data = inputStreamReader.read(); } inputStreamReader.close();
此示例首先创建一个FileInputStream,然后将其包装在InputStreamReader中。其次,该示例通过InputStreamReader从文件中读取所有字符。
注意:为清楚起见,此处已跳过适当的异常处理。要了解有关正确的异常处理的更多信息,请转到Java IO异常处理。
创建一个InputStreamReader
要创建Java" InputStreamReader",我们只需像将其其他任何对象一样实例化它,然后将" InputStream"传递给其构造函数即可。这是一个例子:
InputStream inputStream = new FileInputStream("c:\data\input.txt"); Reader inputStreamReader = new InputStreamReader(inputStream);
这就是创建InputStreamReader
所需要的全部。
设置InputStreamReader字符编码
基础" InputStream"中的字符将使用某些字符编码进行编码。此字符编码在Java中称为字符集或者Charset。两种常用的字符集是ASCII(或者ISO-Latin1)和UTF8(在某些情况下为UTF-16)。
我们需要告诉Java" InputStreamReader"实例,哪些字符集用于设置" InputStream"中的字符。我们可以在InputStreamReader构造函数中执行此操作。这是设置JavaInputStreamReader
使用的字符集的示例:
InputStream inputStream = new FileInputStream("data.txt"); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
如我们所见,字符集作为第二个参数传递给InputStreamReader构造函数。在上面的示例中,使用的字符为" UTF-8"。
获取InputStreamReader字符编码
我们可以通过Java的InputStreamReader实例的getEncoding()方法获取字符编码。这是获取JavaInputStreamReader
所使用的字符编码的示例:
String encoding = inputStreamReader.getEncoding();
read()
InputStreamReader的read方法返回一个包含读取的char的char值的int。这是一个Java的InputStreamReader的read()示例:
int data = inputStreamReader.read();
我们可以将返回的int
强制转换为char
,如下所示:
char aChar = (char) data;
流结束
如果read()方法返回-1,则说明已到达流的末尾,这意味着InputStreamReader中不再有要读取的数据。也就是说,-1作为int值,而不是-1作为byte或者short值。这里有区别!
当到达流的末尾时,我们可以关闭" InputStreamReader"。
通常,我们可以在while循环内从JavaInputStreamReader
中读取内容,如下所示:
int data = inputStreamReader.read(); while(data != -1) { char theChar = (char) data; data = inputStreamReader.read(); } inputStreamReader.close();
如我们所见,while循环一直运行,直到从InputStreamReader的read()方法读取到-1为止。之后,关闭InputStreamReader。有关如何正确关闭InputStreamReader
的更多信息,请参见下一部分。
关闭InputStreamReader
当我们从InputStreamReader中读取完字符后,我们应该记住将其关闭。关闭InputStreamReader也会关闭InputStreamReader从中读取的InputStream实例。
关闭InputStreamReader是通过调用其close()方法来完成的。这是关闭InputStreamReader
的样子:
inputStreamReader.close();
我们还可以使用Java 7中引入的Java try with resources构造。这是通过try-with-resources构造使用和关闭" InputStreamReader"外观的方法:
InputStream input = new FileInputStream("data/text.txt"); try(InputStreamReader inputStreamReader = new InputStreamReader(input)){ int data = inputStreamReader.read(); while(data != -) { System.out.print((char) data)); data = inputStreamReader.read(); } }
请注意,不再有任何显式的close()
方法调用。 try-with-resources构造可以解决这一问题。
还要注意,第一个FileInputStream实例不是在try-with-resources块内创建的。这意味着try-with-resources块不会自动关闭此FileInputStream实例。但是,当关闭InputStreamReader时,它还将关闭其读取的InputStream实例,因此当InputStreamReader关闭时,FileInputStream实例也将关闭。