人生若只如初见

WXY

Java文件写入详解:FileWriter和BufferedWriter的使用

2024-10-11

Java的文件操作包含读写两个方面。对于读取操作,Java提供了Reader抽象类;与之对应,写入操作则由Writer抽象类支持。Writer作为所有输出字符流的统一接口,允许将数据写入文件,实现持久化存储。这种设计确保了读写操作的一致性和灵活性。

FileWriter

FileWriter 是 Writer 的一个实现类,用于直接将字符写入到文件中

FileWriter 创建

绝对路径、相对路径、File 对象都可以创建 Writer,默认会自动创建文件

//绝对路径
FileWriter writer = new FileWriter("/Users/admin/Documents/log/testWrite.txt");
//相对路径
FileWriter writer = new FileWriter("testWrite.txt");
//File 对象
FileWriter writer = new FileWriter(new File("/Users/admin/Documents/log/testWrite.txt"));

文件覆盖写入

在创建 FileWriter 时,可以在构造器里设置当前写入模式为覆盖写入,每次重新创建对象后写入都会覆盖原有文件!

//构造器第二个参数,默认false - 覆盖写入
try (FileWriter writer =
         new FileWriter("/Users/admin/Documents/log/testWrite.txt", false)) {
    writer.write("测试 Writer,我是第一行");
    //写入换行
    writer.write(System.lineSeparator());
    writer.write("测试 Writer,我是第一行");
} catch (Exception e) {
    e.printStackTrace();
}

文件结果:

2024-10-11-cbghhucw.webp

文件追加写入

FileWriter 构造器第二个参数设置为「true」,写入文件的时候不会覆盖原有内容,会直接在文件末尾进行追加

try (FileWriter writer =
         new FileWriter("/Users/admin/Documents/log/testWrite.txt", true)) {
    writer.write("测试追加 Writer,我是第三行");
    //写入换行
    writer.write(System.lineSeparator());
    writer.write("测试追加 Writer,我是第四行");
} catch (Exception e) {
    e.printStackTrace();
}

文件结果:

2024-10-11-ypcaochz.webp

BufferedWriter

BufferedWriter 是 Writer 的另一个实现类,它包装了一个缓存区域,数据的写入会先进入到缓冲区,只有当缓冲区满了或者手动调用「flush」方法才会通过内部的 Writer 真正写入到文件中

try (BufferedWriter writer = new BufferedWriter(
    new FileWriter("/Users/admin/Documents/log/testWrite.txt", false))) {
    writer.write("测试 BufferedWriter,我是第一行");
    //写入换行
    writer.write(System.lineSeparator());
    writer.write("测试 BufferedWriter,我是第二行");
    //如果手动调用 flush 方法,数据就会实时写入到文件中
    //writer.flush();
    //测试缓存 - sleep 过程中看文件是没有内容的
    TimeUnit.SECONDS.sleep(10);
} catch (Exception e) {
    e.printStackTrace();
}

BufferedWriter 提供了「newLine」方法,可以用于换行,其内部实现就是写入一个「换行符」

2024-10-11-wynbsrek.webp