返回

输入输出与字符流

后端

当然,以下是由我利用AI螺旋创作器创作的文章:

之前我们主要围绕File 类,及字节流的两个抽象类InputStream / OutputStream和它们的子类的概念及使用方法做了基本的讲解,从现在开始,我们将开始介绍字符流相关的内容。

字符流

字符流是与字节流相对应的一种流,它以字符为单位进行读写操作。字符流也分为输入流和输出流,分别用Reader和Writer表示。

Reader

Reader是字符输入流的抽象类,它定义了从字符流中读取数据的基本方法。Reader有许多子类,常用的有FileReader和BufferedReader。

  • FileReader :FileReader是从文件中读取字符的流。它继承自Reader类,并实现了FileReader类。FileReader类构造函数接收一个字符串,该字符串表示要打开的文件名。
  • BufferedReader :BufferedReader是一个带缓冲的字符输入流。它继承自Reader类,并实现了BufferedReader类。BufferedReader类构造函数接收一个Reader对象,该Reader对象表示要缓冲的字符输入流。BufferedReader提供了一些方法来方便地读取字符数据,如readLine()方法。

Writer

Writer是字符输出流的抽象类,它定义了向字符流中写入数据的基本方法。Writer有许多子类,常用的有FileWriter和BufferedWriter。

  • FileWriter :FileWriter是向文件中写入字符的流。它继承自Writer类,并实现了FileWriter类。FileWriter类构造函数接收一个字符串,该字符串表示要打开的文件名。
  • BufferedWriter :BufferedWriter是一个带缓冲的字符输出流。它继承自Writer类,并实现了BufferedWriter类。BufferedWriter类构造函数接收一个Writer对象,该Writer对象表示要缓冲的字符输出流。BufferedWriter提供了一些方法来方便地写入字符数据,如write()方法。

编码和解码

字符流的编码和解码过程非常重要。编码是指将字符转换为字节的过程,解码是指将字节转换为字符的过程。编码和解码过程通常使用某种字符集来进行。字符集定义了字符与字节之间的对应关系。常用的字符集有UTF-8、GBK和GB2312。

在Java中,可以使用以下方法来完成字符流的编码和解码:

  • String.getBytes() :将字符串转换为字节数组。
  • new String(byte[]) :将字节数组转换为字符串。
  • Charset.encode() :将字符串转换为字节数组。
  • Charset.decode() :将字节数组转换为字符串。

示例

以下是一个使用字符流读取和写入文件的示例:

// FileReader示例
FileReader reader = new FileReader("input.txt");
int ch = reader.read();
while (ch != -1) {
    System.out.print((char) ch);
    ch = reader.read();
}
reader.close();

// FileWriter示例
FileWriter writer = new FileWriter("output.txt");
writer.write("Hello world!");
writer.close();

// BufferedReader示例
BufferedReader bufferedReader = new BufferedReader(new FileReader("input.txt"));
String line = bufferedReader.readLine();
while (line != null) {
    System.out.println(line);
    line = bufferedReader.readLine();
}
bufferedReader.close();

// BufferedWriter示例
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("output.txt"));
bufferedWriter.write("Hello world!");
bufferedWriter.newLine();
bufferedWriter.write("This is a new line.");
bufferedWriter.close();