You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot @Scheduled定时写入文件:是否创建新文件?

Spring Boot @Scheduled 写入文件:追加还是新建?

嘿,我来帮你搞清楚这个问题~

你的代码其实已经做对了追加写入的配置,具体行为是这样的:

  • 如果 C:\temp\envVarFile.txt 这个文件不存在,FileWriter 会自动帮你创建它
  • 如果文件已经存在,因为你在 FileWriter 的构造方法里传了第二个参数 true,所以每次执行任务时,都会把新的时间追加到文件末尾,完全不会覆盖原有内容

不过你的代码有个小瑕疵:手动管理流的关闭容易出问题,而且嵌套的try-catch可以简化。结合@Rakesh的有效方案,我给你优化一下代码:

@Scheduled(fixedRate = 10000) // 每10秒执行一次
public void writeToMyFile() {
    // 用try-with-resources自动关闭流,不用手动写close()
    try (BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\temp\\envVarFile.txt", true))) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
        writer.append(formatter.format(System.currentTimeMillis())).append("\n"); // 加换行让每条记录单独一行
    } catch (IOException e) {
        // 生产环境建议用日志框架(比如SLF4J)打印,比printStackTrace更规范
        e.printStackTrace();
    }
}

额外给你两个小建议:

  • SimpleDateFormat 不是线程安全的,如果后续你调整了@Scheduled的线程池配置,可能会出问题。推荐用Java 8+的java.time包下的类来替代,比如这样:
    import java.time.ZonedDateTime;
    import java.time.format.DateTimeFormatter;
    
    @Scheduled(fixedRate = 10000)
    public void writeToMyFile() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 'at' HH:mm:ss z");
        try (BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\temp\\envVarFile.txt", true))) {
            writer.append(ZonedDateTime.now().format(formatter)).append("\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
  • 确保C:\temp目录存在,如果目录不存在的话,FileWriter会抛出IOException,可以在代码里先检查并创建目录,或者提前手动创建好

最后再明确一次:当C盘temp目录下已经存在envVarFile.txt时,这段代码(包括你原来的代码)都会在文件末尾追加新的时间记录,完全不会覆盖原有内容哦~

内容的提问来源于stack exchange,提问作者BUY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:28:14