hutool 之文件监听修改(WatchMonitor)

发布时间 2023-11-09 15:32:42作者: 一个小笨蛋

需求

文件修改后读取文件根据文件格式上传数据库

实现

使用hutool WatchMonitor

package com.xpm.sync.syncmes;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.watch.SimpleWatcher;
import cn.hutool.core.io.watch.WatchMonitor;
import cn.hutool.core.io.watch.watchers.DelayWatcher;
import cn.hutool.core.lang.Console;
import cn.hutool.core.text.csv.*;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.WatchEvent;
import java.time.LocalDateTime;
import java.util.List;

@Component
public class AppRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        startWatch();
    }
    //通过watch 方式
    public void startWatch(){
        Console.log("ApplicationRunner start");
        //监听文件修改
        SimpleWatcher watcher = new SimpleWatcher(){
            long lastModified = 0L;
            long current_lastModified = 0L;
            @Override
            public void onModify(WatchEvent<?> event, Path currentPath) {
                File f =FileUtil.file("D:\\test.csv");
                current_lastModified = f.lastModified();
                //不判断会执行两次的
                if(lastModified ==current_lastModified ){
                    //和上次数据一致,不上传
                }else{
                    lastModified = current_lastModified; //重新记录文件修改时间
                    //从文件中读取CSV数据
                    CsvReader reader = CsvUtil.getReader();
                    CsvData data = reader.read(f);
                    List<CsvRow> rows = data.getRows();
                    //遍历行
                    for (CsvRow csvRow : rows) {
                        //getRawList返回一个List列表,列表的每一项为CSV中的一个单元格(既逗号分隔部分)
                        Console.log(csvRow.getRawList());
                    }
                    //TODO
                    Console.log("上传数据库"+LocalDateTime.now());
                }
            }
        };
        //监听器,延迟500s执行
        WatchMonitor monitor = WatchMonitor.createAll("D:\\test.csv",new DelayWatcher(watcher,500));
        monitor.start();
    }
}