当前位置: 首页 > article >正文

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

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

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

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

伪代码方案

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

代码实现

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 注解功能:
spring.main.allow-bean-definition-overriding=true

http://www.kler.cn/a/303380.html

相关文章:

  • 开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-tool usage入门-Qwen-Agent深入学习(四)
  • PNG图片批量压缩exe工具+功能纯净+不改变原始尺寸
  • 设计模式练习(一) 单例模式
  • 数据集标注txt文件读取小工具
  • 豆瓣均分9:不容错过的9本大模型入门宝藏书籍,非常详细收藏我这一篇就够了
  • Elastic Observability 8.16:增强的 OpenTelemetry 支持、高级日志分析和简化的入门流程
  • 2024121读书笔记|《不急:我们慢慢慢慢来》——做人呢,最重要的是开心
  • 从底层原理上理解ClickHouse 中的 Distributed 引擎
  • tomcat项目报错org.apache.jasper.JasperException: java.lang.NullPointerException
  • Python中的“异常”之旅:探索异常处理的艺术
  • 大语言模型之ICL(上下文学习) - In-Context Learning Creates Task Vectors
  • 用于安全研究的 Elastic Container Project
  • Java 行为型设计模式一口气讲完!*^____^*
  • Spring Cloud 搭建 Gateway 网关与统一登录模块:路径重写、登录拦截、跨域配置
  • 使用Jenkins扩展钉钉消息通知
  • 根据NVeloDocx Word模板引擎生成Word(五)
  • 9.12 TFTP通信
  • 阿里巴巴拍立淘API:实时图像搜索与快速响应的技术探索
  • Pycharm Remote Development 报错解决
  • 【机器学习(三)】分类和回归任务-随机森林-Sentosa_DSML社区版
  • 【数据库】死锁排查方式
  • iPhone 16分辨率,屏幕尺寸,PPI 详细数据对比 iPhone 16 Plus、iPhone 16 Pro、iPhone 16 Pro Max
  • CTF比赛中的Git相关题目解题思路
  • Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理
  • TESSY创建需要手写桩的测试用例
  • 麒麟桌面操作系统:查看最近安装与卸载的软件包