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
相关产品推荐
相关产品推荐

