原文: https://www.programiz.com/java-programming/inputstreamreader

在本教程中,我们将借助示例学习 Java InputStreamReader及其方法。

java.io包的InputStreamReader类可用于将字节数据转换为字符数据。

它扩展了抽象类Reader

Java `InputStreamReader`类 - 图1

InputStreamReader类可与其他输入流一起使用。 它也被称为字节流和字符流之间的桥梁。 这是因为InputStreamReader从输入流中读取字节作为字符。

例如,某些字符需要 2 个字节才能存储在存储器中。 要读取此类数据,我们可以使用输入流读取器,该读取器一起读取 2 个字节并将其转换为相应的字符。


创建一个InputStreamReader

为了创建一个InputStreamReader,我们必须首先导入java.io.InputStreamReader包。 导入包后,就可以在这里创建输入流读取器。

  1. // Creates an InputStream
  2. FileInputStream file = new FileInputStream(String path);
  3. // Creates an InputStreamReader
  4. InputStreamReader input = new InputStreamReader(file);

在上面的示例中,我们创建了一个名为inputInputStreamReader以及名为fileFileInputStream

在这里,文件中的数据使用某些默认字符编码存储。

但是,我们也可以在文件中指定字符编码的类型(UTF8UTF16)。

  1. // Creates an InputStreamReader specifying the character encoding
  2. InputStreamReader input = new InputStreamReader(file, Charset cs);

在这里,我们使用了Charset类来指定文件中的字符编码。


InputStreamReader的方法

InputStreamReader类提供了Reader类中存在的不同方法的实现。

read()方法

  • read() - 从读取器读取单个字符
  • read(char[] array) - 从读取器读取字符并将其存储在指定的数组中
  • read(char[] array, int start, int length) - 从读取器中读取等于length的字符数,并从start开始存储在指定的数组中

例如,假设我们有一个名为input.txt的文件,其内容如下。

  1. This is a line of text inside the file.

让我们尝试使用InputStreamReader读取此文件。

  1. import java.io.InputStreamReader;
  2. import java.io.FileInputStream;
  3. class Main {
  4. public static void main(String[] args) {
  5. // Creates an array of character
  6. char[] array = new char[100];
  7. try {
  8. // Creates a FileInputStream
  9. FileInputStream file = new FileInputStream("input.txt");
  10. // Creates an InputStreamReader
  11. InputStreamReader input = new InputStreamReader(file);
  12. // Reads characters from the file
  13. input.read(array);
  14. System.out.println("Data in the stream:");
  15. System.out.println(array);
  16. // Closes the reader
  17. input.close();
  18. }
  19. catch(Exception e) {
  20. e.getStackTrace();
  21. }
  22. }
  23. }

输出

  1. Data in the stream:
  2. This is a line of text inside the file.

在上面的示例中,我们使用文件输入流创建了一个输入流读取器。 输入流读取器与文件input.txt链接。

  1. FileInputStream file = new FileInputStream("input.txt");
  2. InputStreamReader input = new InputStreamReader(file);

要从文件中读取字符,我们使用了read()方法。


getEncoding()方法

getEncoding()方法可用于获取用于在输入流中存储数据的编码类型。 例如,

  1. import java.io.InputStreamReader;
  2. import java.nio.charset.Charset;
  3. import java.io.FileInputStream;
  4. class Main {
  5. public static void main(String[] args) {
  6. try {
  7. // Creates a FileInputStream
  8. FileInputStream file = new FileInputStream("input.txt");
  9. // Creates an InputStreamReader with default encoding
  10. InputStreamReader input1 = new InputStreamReader(file);
  11. // Creates an InputStreamReader specifying the encoding
  12. InputStreamReader input2 = new InputStreamReader(file, Charset.forName("UTF8"));
  13. // Returns the character encoding of the input stream
  14. System.out.println("Character encoding of input1: " + input1.getEncoding());
  15. System.out.println("Character encoding of input2: " + input2.getEncoding());
  16. // Closes the reader
  17. input1.close();
  18. input2.close();
  19. }
  20. catch(Exception e) {
  21. e.getStackTrace();
  22. }
  23. }
  24. }

输出

  1. The character encoding of input1: Cp1252
  2. The character encoding of input2: UTF8

在上面的示例中,我们创建了两个输入流读取器,分别名为input1input2

  • input1未指定字符编码。 因此,getEncoding()方法返回默认字符编码的规范名称。
  • input2指定字符编码 UTF8。 因此,getEncoding()方法返回指定的字符编码。

注意:我们已经使用Charset.forName()方法来指定字符编码的类型。 要了解更多信息,请访问 Java Charset(Java 官方文档)


close()方法

要关闭输入流读取器,我们可以使用close()方法。 调用close()方法后,我们将无法使用读取器读取数据。


InputStreamReader的其他方法

方法 描述
ready() 检查流是否准备好被读取
mark() 标记流中已读取数据的位置
reset() 将控件返回到流中设置标记的点

要了解更多信息,请访问 Java InputStreamReader(官方 Java 文档)