springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档

要在 Spring Boot 中实现实时写入数据到文件,并在文件大小大于 100MB 时按照日期时间归档,主要步骤如下:

  1. 文件写入功能:设置一个日志文件,实时写入数据。
  2. 文件大小检测:在写入数据时检测文件大小,当文件超过 100MB 时执行归档操作。
  3. 文件归档:按日期时间格式重命名并归档现有文件,创建新的日志文件继续写入。

下面是详细的实现步骤和完整代码:

伪代码方案

  1. 初始化 FileWriter,用于实时写入数据。
  2. 每次写入数据后检测当前文件大小。
  3. 当文件大小超过 100MB 时,按照 yyyyMMdd_HHmmss 格式生成归档文件名,并将原文件重命名。
  4. 创建一个新的文件继续写入。

代码实现

java 复制代码
package com.example.filewriter;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.io.*;
import java.nio.file.*;
import java.text.SimpleDateFormat;
import java.util.Date;

@Service
public class FileWritingService {

    private static final String FILE_PATH = "logs/data.log";
    private static final long MAX_FILE_SIZE = 100 * 1024 * 1024; // 100MB
    private BufferedWriter writer;

    public FileWritingService() throws IOException {
        initWriter();
    }

    // 初始化文件写入器
    private void initWriter() throws IOException {
        File file = new File(FILE_PATH);
        if (!file.exists()) {
            file.getParentFile().mkdirs();
            file.createNewFile();
        }
        writer = new BufferedWriter(new FileWriter(file, true)); // 追加模式写入
    }

    // 实时写入数据
    public void writeData(String data) throws IOException {
        writer.write(data);
        writer.newLine();
        writer.flush();

        checkFileSize(); // 检查文件大小
    }

    // 检查文件大小是否超过 100MB
    private void checkFileSize() throws IOException {
        File file = new File(FILE_PATH);
        if (file.length() > MAX_FILE_SIZE) {
            archiveFile();
            initWriter(); // 重新初始化写入器
        }
    }

    // 按日期时间归档文件
    private void archiveFile() throws IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
        String timestamp = sdf.format(new Date());
        Path source = Paths.get(FILE_PATH);
        Path target = Paths.get("logs/archive/data_" + timestamp + ".log");

        // 确保目录存在
        Files.createDirectories(target.getParent());
        
        // 重命名文件进行归档
        Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
    }

    // 模拟实时写数据,每5秒写一次
    @Scheduled(fixedRate = 5000)
    public void simulateWrite() throws IOException {
        writeData("This is a sample log entry at " + new Date());
    }
}

关键点说明

  1. 文件写入 :使用 BufferedWriter 实现实时写入,确保每次写入后调用 flush() 以立即将数据写入文件。
  2. 文件大小检测 :在每次写入后调用 checkFileSize() 检测文件大小。如果大于 100MB,就调用 archiveFile() 进行归档。
  3. 归档文件 :通过 Files.move() 重命名现有文件,归档到 logs/archive/ 目录下,文件名按照 yyyyMMdd_HHmmss 格式命名。
  4. 定时写入 :使用 @Scheduled 注解模拟每5秒写入一次数据,实际可以根据需求调整。

依赖配置

  • 确保你的 Spring Boot 项目中引入了 spring-boot-starter,并在 application.properties 中启用了 @Scheduled 注解功能:
properties 复制代码
spring.main.allow-bean-definition-overriding=true
相关推荐
书源丶21 分钟前
三十六、File 类与 IO 流基础——文件操作的「第一步」
java
刀法如飞27 分钟前
Go数组去重的20种实现方式,AI时代解决问题的不同思路
后端·算法·go
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
swipe1 小时前
别再把 AI 聊天做成纯文本:从 agui 这个前后端项目,拆解“可感知工具调用”的流式 AI UI
后端·langchain·llm
GetcharZp1 小时前
GitHub 爆火!纯 Go 编写的文件同步神器 Syncthing,凭什么成为程序员的标配?
后端
hERS EOUS1 小时前
SpringBoot 使用 spring.profiles.active 来区分不同环境配置
spring boot·后端·spring
DFT计算杂谈1 小时前
wannier90 参数详解大全
java·前端·css·html·css3
LucianaiB1 小时前
我用飞书多维表做了一个 AI 活动推荐智能体:每天自动催我别错过截止日期!
后端
marsh02061 小时前
43 openclaw熔断与降级:保障系统在异常情况下的可用性
java·运维·网络·ai·编程·技术
张健11564096482 小时前
临界区和同一线程上锁
java·开发语言·jvm