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
相关推荐
数据小爬虫@7 分钟前
淘宝商品评论爬虫:Java版“窃听风云”
java·开发语言
2401_8576176212 分钟前
企业OA管理系统:Spring Boot技术深度探索
数据库·spring boot·后端
委婉待续12 分钟前
java抽奖系统(二)
java·开发语言
BestandW1shEs16 分钟前
彻底理解微服务的作用和解决方案
java·微服务
mit6.82429 分钟前
[Redis#0] iredis: linux上redis超好用的环境配置
linux·redis·后端
Crazy程序猿202042 分钟前
jar包解压和重新打包
java·jar
老马啸西风42 分钟前
java 老矣,尚能饭否?
java
捂月1 小时前
从零开始:使用 Spring Boot 开发图书管理系统
java·spring boot·后端
张彦峰ZYF1 小时前
接口性能优化宝典:解决性能瓶颈的策略与实践
java·redis·分布式·后端·算法·性能优化·架构
浅念同学1 小时前
JavaEE-线程安全专题
java·安全·java-ee