Java实现文件监听,并获取变化的内容(二)

文章介绍了如何在Java中利用ApacheCommonsIO库中的FileAlterationMonitor和FileAlterationObserver来监控文件的变化,包括创建、修改和删除,以及通过FileListener实现对文件内容的实时处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

采用Apache Commons IO 类实现
1、Apache Commons IO 提供了高级的文件监听器(FileAlterationMonitor)和监听器适配器(FileAlterationListenerAdaptor),简化了监听文件变化的过程。
2、可以更轻松地实现监听器,并提供了多种事件(文件修改、创建、删除等)的监听。

package com.sinorail.ferry.utils;

import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;

/**
 * @Author wangchang
 * @Description
 * @Date 2024/3/25 11:07
 */
public class WatchVsftpdLogUtil {
    private static final Logger log = LoggerFactory.getLogger(WatchVsftpdLogUtil.class);

    public static void main(String[] args) throws Exception {
        // 指定要监听的文件路径
        String filePath = "C:\\Users\\86156\\Desktop\\upload\\test.txt";

        // 创建一个文件变化监视器
        FileAlterationObserver observer = new FileAlterationObserver(new File(filePath).getParent());
        FileListener listener = new FileListener(filePath);
        observer.addListener(listener);

        // 设置文件变化监视器的轮询间隔(以毫秒为单位)
        long pollingInterval = 1000; // 1秒
        FileAlterationMonitor monitor = new FileAlterationMonitor(pollingInterval);
        monitor.addObserver(observer);

        // 启动监视器以开始监听文件的改变
        monitor.start();

        // 运行一段时间后停止监视器
//        Thread.sleep(60000); // 监听 60 秒
//        monitor.stop();
    }
}






package com.sinorail.ferry.utils;

import cn.hutool.core.util.StrUtil;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;

/**
 * @Author wangchang
 * @Description
 * @Date 2024/3/25 15:10
 */

public class FileListener extends FileAlterationListenerAdaptor {
    private static final Logger log = LoggerFactory.getLogger(FileListener.class);


    private String filePath;
    private long lastPosition = 0;

    private long lastFileSize = 0;

    public FileListener(String filePath) {
        this.filePath = filePath;
    }


    @Override
    public void onFileCreate(File file) {
        //TODO 创建
    }

    @Override
    public void onFileChange(File file) {
        if (file.getPath().equals(filePath)) {
            log.info("File modified: " + file.getPath());
            // 日志会周期性删除,这里判断如果当前文件小于上一次记录的,就重新开始记录位置
            if (file.length() < lastFileSize) {
                lastPosition = 0;
            }
            // 打开文件并定位到上次记录的位置
            try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) {
                randomAccessFile.seek(lastPosition);

                try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(randomAccessFile.getFD()), "UTF-8"))) {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        // 在这里可以对读取到的内容进行处理
                        if (StrUtil.isNotEmpty(line)) {
                            System.out.println("修改的内容::" + line);
                        }
                    }

                    // 更新记录的位置为文件的当前长度
                    lastPosition = randomAccessFile.getFilePointer();
                    // 记录当前文件的大小
                    lastFileSize = file.length();
                }
            } catch (IOException ex) {
                // 可以记录错误信息或者继续监听其他事件
                ex.printStackTrace();
            }
        }
    }

    @Override
    public void onFileDelete(File file) {
        // TODO 删除
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王之蔑视.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值