如何仅向文本文件写入一次日期?现有代码问题排查
问题排查与修复方案
Hey,我来帮你捋捋代码里的问题——你遇到的每次运行都覆盖日期、无法读取旧内容的情况,核心是流的初始化时机和FileWriter的默认行为出了问题,我一步步给你拆解:
为啥你的代码会失效?
- FileWriter默认清空文件:你在代码开头就创建了
FileWriter writer = new FileWriter(file);,这个构造函数的默认逻辑是直接截断(清空)目标文件,不管后面的file.length()判断,所以哪怕文件原本有内容,也会被先清空,导致后续读取不到旧日期。 - 流的顺序搞反了:你先打开写入流,再打开读取流,这时候文件已经被清空,
file.length()必然为0,程序永远只会走写入分支,根本没机会读取旧内容。 - 资源泄漏风险:如果程序走到读取分支,写入流没有被关闭,会造成IO资源泄漏;而且手动调用
close()很容易遗漏异常场景下的关闭操作。 - 未处理文件不存在的情况:如果是首次运行,文件还没创建,
new FileReader("outTest.txt")会直接抛出FileNotFoundException,原代码没处理这个场景。
修复后的完整代码
我用Java 7+支持的try-with-resources语法自动管理流(不用手动关流),同时调整了逻辑顺序,先判断文件状态再决定操作:
import java.io.*; import java.text.SimpleDateFormat; import java.util.Date; public class Main { public static void main(String[] args) throws IOException { File dateFile = new File("outTest.txt"); SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); String currentTime = timeFormat.format(new Date()); // 先判断:文件不存在 或者 文件为空(首次运行) if (!dateFile.exists() || dateFile.length() == 0) { // try-with-resources自动关闭FileWriter,无需手动close try (FileWriter writer = new FileWriter(dateFile)) { writer.write(currentTime); writer.flush(); System.out.println("首次运行,已写入当前时间:" + currentTime); } } else { // 读取已有文件内容并输出 try (FileReader fileReader = new FileReader(dateFile); BufferedReader bufferedReader = new BufferedReader(fileReader)) { String savedTime; while ((savedTime = bufferedReader.readLine()) != null) { System.out.println("读取到已保存的时间:" + savedTime); } } } } }
关键改动说明
- 先判断再操作:先检查文件是否存在或为空,再决定打开写入流还是读取流,彻底避免提前清空文件的问题。
- try-with-resources自动关流:所有IO流都在
try()块中声明,JVM会在代码块结束后自动关闭它们,既安全又省心。 - 明确处理文件不存在场景:新增
!dateFile.exists()判断,覆盖首次运行创建文件的情况,避免读取不存在的文件抛出异常。
内容的提问来源于stack exchange,提问作者kentforth
相关产品推荐
相关产品推荐

