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
相关推荐
原来是好奇心2 分钟前
用户登录Token缓存Redis实践:提升SpringBoot应用性能
spring boot·redis·缓存
1点东西5 分钟前
新来的同事问我当进程/机器突然停止时,finally 到底会不会执行?
java·后端·程序员
AAA修煤气灶刘哥25 分钟前
后端仔狂喜!手把手教你用 Java 拿捏华为云 IoTDA,设备上报数据 so easy
后端·物联网·华为
Aspartame~35 分钟前
K8s的相关知识总结
java·容器·kubernetes
G探险者37 分钟前
如何在批量创建 `DefaultMessageListenerContainer` 时避免阻塞问题
后端
寒士obj1 小时前
MyBatis-Plus基础篇详解
java·mybatis
我崽不熬夜1 小时前
List、Set、Map,你真的会选用吗?
java·后端·java ee
Y4090011 小时前
Java算法之排序
java·数据结构·笔记·算法
展信佳_daydayup2 小时前
01 基础篇-虚拟机网络配置
后端
uhakadotcom2 小时前
最近rust生态有啥能力更新?
后端·面试·github