java监控文件变化,并分别使用RandomAccessFile和BufferedReader读取

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.TimeUnit;

import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.commons.lang3.StringUtils;

import lombok.extern.slf4j.Slf4j;
/**
 * 文件变化监听器
 * 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
 * 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
 * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
 */
@Slf4j
public class FileListener extends FileAlterationListenerAdaptor {

    //记录上次读取位置
    private long num = 0;

    public static void main(String[] args) throws Exception {
        // 监控目录
        String rootDir = "E:\\data\\";
        // 轮询间隔 毫秒
        long interval = TimeUnit.MILLISECONDS.toMillis(500);
        // 创建过滤器
        IOFileFilter directories = FileFilterUtils.and(FileFilterUtils.directoryFileFilter(), HiddenFileFilter.VISIBLE);
        IOFileFilter files = FileFilterUtils.and(FileFilterUtils.fileFileFilter(),
                FileFilterUtils.suffixFileFilter(".txt"));
        IOFileFilter filter = FileFilterUtils.or(directories, files);
        // 使用过滤器
        FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir), filter);
        // 不使用过滤器
        // FileAlterationObserver observer = new FileAlterationObserver(new
        // File(rootDir));
        observer.addListener(new FileListener());
        // 创建文件变化监听器
        FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
        // 开始监控
        monitor.start();
    }

    /**
     * 文件修改
     */
    public void onFileChange(File file) {
        changeNotice(file.getAbsolutePath(), "文件修改");
        log.info("[修改]:" + file.getAbsolutePath());

        RandomAccessFile randomAccessFile = null;
        try {
            randomAccessFile = new RandomAccessFile(file, "r");
            randomAccessFile.seek(num);

            String s = randomAccessFile.readLine();

                for (; s != null; s = randomAccessFile.readLine()) {
                    if (StringUtils.isNotBlank(s)) {
                        log.info("修改内容:" + new String(s.getBytes("ISO-8859-1"), "utf-8"));
                    }
                }

            num = randomAccessFile.length();
            log.info("下一次的num号:" + num);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (randomAccessFile != null) {
                try {
                    randomAccessFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

 /**
   * 文件创建执行
   */
  public void onFileCreate(File file) {
    changeNotice(file.getAbsolutePath(), "文件创建");
    log.info("[新建]:" + file.getAbsolutePath());
  }

  /**
   * 文件删除
   */
  public void onFileDelete(File file) {
    changeNotice(file.getAbsolutePath(), "文件删除");
    log.info("[删除]:" + file.getAbsolutePath());
  }
  /**
   * 目录创建
   */
  public void onDirectoryCreate(File directory) {
    changeNotice(directory.getAbsolutePath(), "目录创建");
    log.info("[新建]:" + directory.getAbsolutePath());
  }
  /**
   * 目录修改
   */
  public void onDirectoryChange(File directory) {
    changeNotice(directory.getAbsolutePath(), "目录修改");
//    log.info("[修改]:" + directory.getAbsolutePath());
  }

  /**
   * 目录删除
   */
  public void onDirectoryDelete(File directory) {
    changeNotice(directory.getAbsolutePath(), "目录删除");
//    log.info("[删除]:" + directory.getAbsolutePath());
  }
  public void onStart(FileAlterationObserver observer) {
//    log.info("文件变化监听器启动");
    super.onStart(observer);
  }
  public void onStop(FileAlterationObserver observer) {
//    log.info("文件变化监听器停止");
    super.onStop(observer);
  }

  public void changeNotice(String filePath, String type) {
//      log.info(type + ":"+ filePath);
  }

}
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.Scanner;

public class ReadFile2 {
    // 输出本行内容及字符数
    static void readLineVarFile(String fileName, int lineNumber) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); // 使用缓冲区的方法将数据读入到缓冲区中
        String line = reader.readLine(); // 定义行数
        if (lineNumber  getTotalLines(fileName)) // 确定输入的行数是否有内容
        {
            System.out.println("不在文件的行数范围之内。");
        }
        int num = 0;
        while (line != null) // 当行数不为空时,输出该行内容及字符数
        {
            if (lineNumber == ++num) {
                System.out.println("第" + lineNumber + "行: " + line + "     字符数为:" + line.length());
            }
            line = reader.readLine();
        }
        reader.close();
    }

    // 文件内容的总行数
    static int getTotalLines(String fileName) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); // 使用缓冲区的方法将数据读入到缓冲区中
        LineNumberReader reader = new LineNumberReader(br);
        String s = reader.readLine(); // 定义行数
        int lines = 0;
        while (s != null) // 确定行数
        {
            lines++;
            s = reader.readLine();
        }
        reader.close();
        br.close();
        return lines; // 返回行数
    }

    public static void main(String[] args) throws IOException {
        String fileName = "E:\\data\\a.txt"; // 读取文件
        int totalNo = getTotalLines(fileName); // 获取文件的内容的总行数
        System.out.println("本文总共有:" + totalNo + "行");
        while (true) {
            Scanner sc = new Scanner(System.in);
            int lineNumber = sc.nextInt(); // 指定读取的行号
            readLineVarFile("E:\\\\data\\\\a.txt", lineNumber); // 读取指定行的内容
        }
    }
}

看完打开支付宝扫一扫领个红包吧!

java监控文件变化,并分别使用RandomAccessFile和BufferedReader读取

Original: https://www.cnblogs.com/shihaiming/p/16376659.html
Author: 这个名字想了很久~
Title: java监控文件变化,并分别使用RandomAccessFile和BufferedReader读取

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538243/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java 求两区间的交集,并返回交集区间

    java;gutter:true; public double[] confMatrix(double[] arr1, double[] arr2){ double[] con =…

    Java 2023年5月29日
    092
  • 实现随机验证码

    Java实现随机验证码的生成 随机验证码: 法一:普通方法 核心逻辑: 1.定义一个String类型的变量存储验证码字符。 2.定义一个for循环,循环n次(n为验证码的所需要字符…

    Java 2023年6月6日
    076
  • Spring透过ApplicationListener来触发contextrefreshedevent事件

    Spring通过 ApplicationListener接口来触发 contextrefreshedevent事件在开发时有时候需要在整个应用开始运行时执行一些特定代码,比如初始化…

    Java 2023年5月30日
    063
  • cv :: Mat线程安全吗(原子分配+引用计数)?

    Is cv::Mat thread-safe (atomic assignment + refcounting)? https://isocpp.github.io/CppCore…

    Java 2023年5月29日
    070
  • rabbitmq安装

    rabbitmq简介 rabbitmq安装 rabbitmq是erlang语言开发的,rabbitmq安装需要先安装erlang,再安装rabbitmq; ​ 官方网址: 双击安装…

    Java 2023年6月16日
    061
  • 常用命令

    移动文件:mv [源文件] [目标文件]删除文件或目录:rm –d删除目录 –f强制删除 –r递归删除 [文件或目录名]修改文件或目录群组:chgrp –r递归 [群组] [文件或…

    Java 2023年6月9日
    061
  • JDK下载、安装与环境配置

    一、JDK下载与安装 1.1、下载JDK安装包 博主在这里给大家准备了一个64位操作系统的jdk1.8以便大家下载(使用的是迅雷)点击此处下载提取码:dfbt 如果其他小伙伴的电脑…

    Java 2023年6月5日
    069
  • Linux firewall防火墙设置

    1、查看firewall服务状态 2、查看firewall的状态 3、开启、重启、关闭、firewalld.service服务 4、查看防火墙规则 5、查询、开放、关闭端口 Ori…

    Java 2023年6月7日
    073
  • 日常踩坑_@ConfigurationProperties显示prefix must be in canonical form

    在使用 @ConfigurationProperties时,好死不死报了一个我看不懂的红,像这样 我自然是一副很懵逼的状态,红线上写的错是prefix must be in can…

    Java 2023年6月7日
    068
  • 微服务-springboot 部署无法读取文件 进行处理

    原因:本地用获取路径方式没问题,线上就出现打印 jar目录的问题。 第一种: java;gutter:true; String classpath = this.getClass(…

    Java 2023年6月9日
    068
  • SpringCloud之Gateway

    1.Gateway是什么? 1.1 为微服务提供简单有效的路由管理方式1.2 词汇(1)Route(路由) :构建网关的基础模块,由ID、目标URL、断言和过滤器等组成id:路由唯…

    Java 2023年6月13日
    066
  • SpringCloudAlibaba项目之Nacos-config配置中心

    SpringCloudAlibaba随笔目录 一、SpringCloudAlibaba项目之父工程搭建 二、 SpringCloudAlibaba项目之Nacos搭建及服务注册 三…

    Java 2023年6月5日
    079
  • 注解@Slf4j

    如果不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@Slf4j 一、在p…

    Java 2023年6月13日
    053
  • 模拟tomcat服务器,sun公司,webapp开发者

    模拟tomcat服务器,sun公司,webapp开发者 首先我们思考一下一个动态web应用需要哪些角色参与,角色与角色之间又有多少协议? 1.有4种角色,分别是(浏览器开发团队[如…

    Java 2023年6月5日
    065
  • 22.1.23Manacher算法、双端队列、单调栈

    22.1.23Manacher算法、双端队列、单调栈 1.Manacher算法 1)用途: Manacher算法用于解决类似求某个字符串中最长的回文子串。(回文就是正着读和倒着读一…

    Java 2023年6月13日
    062
  • 显示listview的行号

    想用的时候,总忘记了怎么拼,做个记录,下次该不会忘记了. Original: https://www.cnblogs.com/Blackie/archive/2008/08/02/…

    Java 2023年6月14日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球