0、
    在程序开发中,经常需要对文本文件的内容进行读取,如果想从文件中直接读取字符,便可以使用字符输入流 FileReader,通过此流可以从关联的文件中读取一个或一组字符。接下来通过一个案例来学习如何使用 FileReader 读取文件中的字符。

    首先在项目当前目录下新建文本文件“reader.txt”并在其中输入字符“itcast”,然后创建一个使用字符输入流 FileReader 读取文件中字符的类,如下所示。

    1. import java.io.FileReader;
    2. public class example07 {
    3. public static void main(String[] args) throws Exception {
    4. //创建一个 FileReader 对象来读取文件中的字符
    5. FileReader reader = new FileReader("reader.txt");
    6. int ch; //定义一个变量用于记录读取的字符
    7. while ((ch = reader.read()) != -1) { //循环并判断是否读取到文件的末尾
    8. System.out.print((char) ch + " "); //不是字符流末尾就把字节转为字符并打印
    9. }
    10. reader.close();
    11. }
    12. }
    13. console:
    14. i t c a s t

    实现了读取文件字符的功能。首先创建一个 FileReader 对象与文件关联,然后通过 while 循环每次从文件中读取一个字符并打印,这样便实现了 FileReader 读文件字符的操作。需要注意的是,字符输入流的 read()方法返回的是 int 类型的值,如果想获得字符就需要进行强制类型转换,代码块中的第九行代码的作用就是将变量 ch 转为 char 类型并打印。

    1、上面讲到了如何使用 FileReader 读取文件中的字符,如果要向文件中写入字符就需要使用 File Writer 类,该类是 Writer 的一个子类。接下来通过一个案例来学习如何使用 FileWriter 将字符写入文件,如下所示。

    1. import java.io.FileWriter;
    2. public class example08 {
    3. public static void main(String[] args) throws Exception{
    4. //创建一个 FileWriter 对象用于向文件中写入数据
    5. FileWriter writer = new FileWriter("writer.txt");
    6. String str = "你好,传智播客";
    7. writer.write(str); //将字符数据写入到文本文件中
    8. writer.write("\r\n"); //将输出语句换行
    9. writer.close(); //关闭写入流,释放资源
    10. }
    11. }

    程序运行结束后,会在当前目录下生成一个名称为“write.txt”的文件,打开此文件会看到如下图所示的内容。
    QQ截图20200609163146.png

    FileWriter 同 FileOutputStream 一样,如果指定的文件不存在,就会先创建文件,再写入数据,如果文件存在,则会首先清空文件中的内容,再进行写入。如果想在文件末尾追加数据,同样需要调用重载的构造方法,先将上述代码块中的第 6 行代码进行如下修改。(在 7.1.2 小节有更加详细的解释,复习时可点击 7.1.2 字节流读写文件

    1. FileWriter writer = new FileWriter("writer.txt", true);

    修改后,再次运行程序,即可实现在文件中追加内容的效果。

    2、
    7.1.5 字节缓冲流中,学习了包装流可以通过对一个已存在的流进行包装来实现数据读写功能,利用包装流可以有效地提高读写数据的效率。字符流同样提供了带缓冲区的包装流,分别是 BufferedReader 和 BufferedWriter。其中,BufferedReader 用于对字符输入流进行包装,BufferedWriter 用于对字符输出流进行包装。
    接下来通过一个案例来学习如何使用这两个包装流实现文本的拷贝,如下所示。

    1. import java.io.*;
    2. public class example09 {
    3. public static void main(String[] args) throws Exception{
    4. //创建一个 BufferedReader 缓冲区对象
    5. BufferedReader br = new BufferedReader(new FileReader("src.txt"));
    6. //创建一个 BufferedWriter 缓冲区对象
    7. BufferedWriter bw = new BufferedWriter(new FileWriter("des.txt"));
    8. String str;
    9. while ((str = br.readLine()) != null) {
    10. bw.write(str);
    11. bw.newLine();
    12. }
    13. br.close();
    14. bw.close();
    15. }
    16. }

    在上述代码块中,使用了输入输出缓冲区对象,并通过一个 while 循环实现了文本文件的拷贝。在拷贝过程中,每次循环都使用 readLien()方法读取文件的一行,然后通过 write()方法写入目标文件。其中,readLine()方法会逐个读取字符,当读到回车符’\r’或换行符’\n’时会将读到的字符作为一行的内容返回。

    需要注意的是,由于字符缓冲流内部使用了缓冲区,在循环中调用 BufferedWriter 的 write()方法写入字符时,这些字符首先会被写入缓冲区,当缓冲区写满时或调用 close()方法时,缓冲区中的字符才会被写入目标文件。因此在循环结束时一定要调用 close()方法,否则极有可能会导致部分存在缓冲区中的数据没有被写入目标文件。

    关于为什么在 BufferWriter 中需要一个专门用来换行的 newLine()方法,这里有个较好的解释。
    image.png