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
相关推荐
【D'accumulation】29 分钟前
典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式
java·设计模式·mvc
wn53139 分钟前
【Go - 类型断言】
服务器·开发语言·后端·golang
试行44 分钟前
Android实现自定义下拉列表绑定数据
android·java
茜茜西西CeCe1 小时前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
bjzhang751 小时前
SpringBoot开发——集成Tess4j实现OCR图像文字识别
spring boot·ocr·tess4j
救救孩子把1 小时前
Java基础之IO流
java·开发语言
flying jiang1 小时前
Spring Boot 入门面试五道题
spring boot
小菜yh1 小时前
关于Redis
java·数据库·spring boot·redis·spring·缓存
宇卿.1 小时前
Java键盘输入语句
java·开发语言
浅念同学1 小时前
算法.图论-并查集上
java·算法·图论