Java InputStreamReader

时间:2020-01-09 10:36:04  来源:igfitidea点击:

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实例也将关闭。