1. 简介

在本教程中,我们将探讨如何使用 Java 清空一个文件的内容,但保留文件本身。虽然看起来是个小操作,但在实际开发中,尤其是做日志清理、临时文件处理时,经常会用到。

清空文件内容的方法有很多种,有些简单粗暴,有些则需要依赖第三方库。下面我们就逐个来看。

2. 使用 PrintWriter

PrintWriterWriter 的子类,常用于向文本输出流中打印格式化后的对象内容。

我们可以直接创建一个指向目标文件的 PrintWriter 实例,然后关闭它,就能达到清空文件内容的效果:

new PrintWriter(FILE_PATH).close();
assertEquals(0, StreamUtils.getStringFromInputStream(new FileInputStream(FILE_PATH)).length());

✅ 如果你不需要后续继续使用这个 PrintWriter 对象,这种方式最简洁高效。

如果后续还需要操作这个 writer,可以这样做:

PrintWriter writer = new PrintWriter(FILE_PATH);
writer.print("");
// 其他操作
writer.close();

3. 使用 FileWriter

FileWriter 是 Java 标准 IO 包中的类,用来写入字符数据。

同样的效果可以用 FileWriter 实现:

new FileWriter(FILE_PATH, false).close();

⚠️ 第二个参数 false 表示不追加内容,而是覆盖写入(默认就是 false)。

如果你需要继续使用该对象进行写入操作,可以赋值给变量后再操作。

4. 使用 FileOutputStream

FileOutputStream 是用于向文件写入字节数据的输出流。

清空文件内容的方式如下:

new FileOutputStream(FILE_PATH).close();

这会将文件长度置为 0,达到清空目的。

5. 使用 Apache Commons IO 的 FileUtils

Apache Commons IO 是一个非常实用的 IO 工具库,能简化很多常见操作。

要使用它清空文件内容,只需添加依赖:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

然后调用 FileUtils.write() 方法:

FileUtils.write(new File(FILE_PATH), "", Charset.defaultCharset());

✅ 这种方式语义清晰,适合不想手动管理流的情况。

6. 使用 Java NIO 的 Files

NIO 提供了更现代的文件操作方式,我们也可以通过 Files 类来清空文件内容:

BufferedWriter writer = Files.newBufferedWriter(Paths.get(FILE_PATH));
writer.write("");
writer.flush();

虽然代码稍微多一点,但它基于 NIO,性能更好,在高并发场景下更推荐使用。

7. 使用 Java NIO 的 FileChannel

FileChannel 是 NIO 中用于连接文件的通道类,功能强大。

我们可以通过 truncate(0) 来截断文件内容到 0 字节:

FileChannel.open(Paths.get(FILE_PATH), StandardOpenOption.WRITE).truncate(0).close();

✅ 这种方式非常高效,适合对性能有要求的场景。

8. 使用 Guava

Guava 是 Google 提供的一套 Java 工具库,也提供了便捷的文件操作方法。

首先引入依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

然后使用 Guava 清空文件内容:

File file = new File(FILE_PATH);
byte[] empty = new byte[0];
com.google.common.io.Files.write(empty, file);

⚠️ 注意:Guava 的 Files.write() 方法接受的是字节数组,这里传入空数组即可。

9. 总结

以上就是几种常见的 Java 清空文件内容的方式,总结如下:

方式 是否需要依赖 说明
PrintWriter 简单粗暴,适合一次性操作
FileWriter 常规做法,兼容性好
FileOutputStream 面向字节,适合底层操作
FileUtils (Apache Commons IO) 语义清晰,推荐日常使用
Files (NIO) 更现代的方式,适合高性能场景
FileChannel (NIO) 性能最佳,适合批量处理
Guava 功能丰富,API 设计优雅

本文完整代码可从 GitHub 仓库 获取。


原始标题:Delete the Contents of a File in Java

« 上一篇: Java Weekly, 第265期