Java实现监听文件变化的三种方案详解

Java实现监听文件变化的三种方案详解

在Java编程中,经常需要对文件进行监听,以便在文件发生更新时及时做出相应的处理。下面将介绍三种实现文件监听的方案,分别是Java 7的WatchService、commons-io库、以及第三方库jnotify。

1. Java 7的WatchService

Java 7引入了WatchService API,它可以用来监听文件目录中的所有变化,包括文件的创建、修改、删除、重命名等。下面是基本的WatchService示例:

import java.io.*;
import java.nio.file.*;

public class FileWatcherTest {

    public static void main(String[] args) throws IOException, InterruptedException {

        WatchService watcher = FileSystems.getDefault().newWatchService();
        Path dir = Paths.get("/Users/username/test/");
        dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,  
        StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);

        while (true) {
            WatchKey key;
            try {
                key = watcher.take();
            } catch (InterruptedException ex) {
                return;
            }

            for (WatchEvent<?> event : key.pollEvents()) {
                WatchEvent.Kind<?> kind = event.kind();

                if (kind == StandardWatchEventKinds.OVERFLOW) {
                    continue;
                }

                WatchEvent<Path> e = (WatchEvent<Path>)event;
                Path filename = e.context();

                // 打印出文件变化事件类型和文件名
                System.out.println(kind + " -> " + filename);
            }

            boolean valid = key.reset();
            if (!valid) {
                break;
            }
        }
    }
}

上述代码将监听指定目录(/Users/username/test/)中所有文件的创建、修改、删除事件,并且当这些事件发生时,会打印出事件类型和文件名。在这个示例中,我们使用了WatchService的take()方法来阻塞等待事件的发生,一旦事件发生即会被唤醒。

2. commons-io库

Apache Commons IO库提供了一个监视器(FileMonitor)类,可以监听指定目录中的文件变化。这个监视器在后台运行,可以周期性地扫描指定的目录,并且对发生变化的文件会回调一个指定的监听器类。

下面是一个简单的示例,演示了如何监听指定目录中所有的txt文件:

import org.apache.commons.io.monitor.*;
import java.io.*;

public class MonitorTest {
    public static void main(String[] args) throws Exception {
        File folder = new File("/Users/username/test/");   
        FileAlterationObserver observer = new FileAlterationObserver(folder);

        // 过滤规则,只对txt文件进行监听           
        FileFilter filter = FileFilterUtils.suffixFileFilter(".txt"); 
        observer.setFileFilter(filter);    

        // 监听器
        FileAlterationListener listener = new FileAlterationListenerAdaptor() {
            public void onFileCreate(File file) {
                System.out.println("File created: " + file.getAbsolutePath());
            }

            public void onFileChange(File file) {
                System.out.println("File changed: " + file.getAbsolutePath());
            }

            public void onFileDelete(File file) {
                System.out.println("File deleted: " + file.getAbsolutePath());
            }
        };

        observer.addListener(listener);

        // 开始监听
        FileAlterationMonitor monitor = new FileAlterationMonitor(5000); // 5秒扫描一次
        monitor.addObserver(observer);
        monitor.start();
    }
}

上述代码使用了FileAlterationObserver类来监控指定目录文件的变化,添加了过滤规则只监听指定后缀名的txt文件,实现了三种事件回调的方法。代码中使用了FileAlterationMonitor来启动监控进程,每隔5秒监听一次文件变化。

3. jnotify

jnotify是一个跨平台的文件系统监听库,为JVM提供了更高效、更可靠的文件监控机制。jnotify需要本地库的支持,所以使用前需要根据操作系统的不同下载对应的jni实现,并引用库文件。

下面是jnotify的一个示例,演示了如何监听指定目录中所有的txt文件:

import net.contentobjects.jnotify.*;

public class JNotifyTest {
    public static void main(String[] args) throws Exception {
        String path = "/Users/username/test/";

        JNotify.addWatch(path, 
            JNotify.FILE_CREATED, 
            JNotify.FILE_DELETED, 
            JNotify.FILE_MODIFIED, 
            JNotify.FILE_RENAMED);

        JNotifyListener listener = new JNotifyListener() {
            public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
                System.out.println("File renamed: " + oldName + " -> " + newName);
            }

            public void fileModified(int wd, String rootPath, String name) {
                System.out.println("File modified: " + name);
            }

            public void fileDeleted(int wd, String rootPath, String name) {
                System.out.println("File deleted: " + name);
            }

            public void fileCreated(int wd, String rootPath, String name) {
                System.out.println("File created: " + name);
            }
        };

        // 开始监听
        int watchId = JNotify.addWatch(path, JNotify.FILE_ANY, true, listener);

        // 等待事件
        Thread.sleep(1000000);

        // 删除监听
        boolean res = JNotify.removeWatch(watchId);
        if (!res) {
            System.out.println("Error removing watch");
        }
    }
}

上述代码使用了jnotify的addWatch()方法来添加对指定目录的监听,指定了四种事件类型,并且实现了指定路径下发生变化回调的listener。在示例中,我们等待1000000毫秒,让程序一直监听文件变化,当监听到变化时将输出事件类型和文件名。在示例结束后,我们使用jnotify的removeWatch()方法来终止监听。

以上是三种实现文件监听的方法,各有其优缺点,可以根据具体需求选择适当的方法。在实际项目中,我们可以根据文件系统的特点和自身业务逻辑的需求来选择最适合的方案。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现监听文件变化的三种方案详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • JavaEE账号注册模拟网站邮箱激活

    JavaEE账号注册模拟网站邮箱激活是一个常见的Web应用程序开发需求。具体实现这个功能的步骤如下: 1. 搭建Web应用程序 首先,需要搭建一个基于JavaEE的Web应用程序,这个应用程序会充当网站的后端服务器,接收客户端请求并返回数据。可以使用诸如Tomcat、Jetty等开源的Web服务器来搭建这个Web应用程序。 2. 设计数据库 建立数据库表,通…

    Java 2023年6月15日
    00
  • Java实现微信公众号获取临时二维码功能示例

    Java实现微信公众号获取临时二维码功能示例 在微信公众号开发中,获取临时二维码是一个常见的功能。本文将介绍如何使用Java实现微信公众号获取临时二维码功能的完整攻略。 1. 准备工作 在实现微信公众号获取临时二维码功能之前,需要进行以下准备工作: 注册微信公众号,并申请开发者权限,获取相关开发信息(如appID、appSecret等)。 使用Java开发环…

    Java 2023年5月26日
    00
  • 详解Spring Boot实战之Filter实现使用JWT进行接口认证

    那我将为你详细讲解“详解Spring Boot实战之Filter实现使用JWT进行接口认证”的完整攻略。 1. 前言 在Web应用程序中,为了保障接口安全和数据的完整性,我们需要对访问接口的用户进行认证和授权。Spring Boot框架提供了多种认证和授权方式,其中,JWT是一种较为流行的认证方式。本文将通过Spring Boot实战教程来详细讲解如何使用F…

    Java 2023年5月20日
    00
  • Java Apache POI报错“NullArgumentException”的原因与解决办法

    “NotOfficeXmlFileException”是Java的Apache POI类库中的一个异常,通常由以下原因之一引起: 文件格式错误:如果文件不是Office Open XML格式,则可能会出现此异常。例如,可能会尝试读取旧版的Microsoft Office文件或尝试读取其他文件类型。 以下是两个实例: 例1 如果文件格式错误,则可以尝试使用正确…

    Java 2023年5月5日
    00
  • Java日常练习题,每天进步一点点(4)

    Java日常练习题每天进步一点点(4)的完整攻略如下: 1. 题目描述 本题共有两道小题: 题目1:设计一个验证码,验证码中包含字母和数字,并且验证码的长度为6位。 题目2:设计一个判断两个字符串是否可变换而成的函数,例如:输入字符串abc和bca,输出true。 2. 解题思路 题目1 设计验证码需要随机生成字母和数字,并且验证码的长度为6位。可以使用以下…

    Java 2023年5月20日
    00
  • 出现java.lang.NoSuchMethodException异常的解决(靠谱)

    针对这个问题,以下是针对java.lang.NoSuchMethodException异常出现的完整攻略: 1. 异常原因分析 在程序运行过程中,如果出现java.lang.NoSuchMethodException异常,通常是因为程序调用了不存在的方法而导致的。具体分析原因可以按照以下步骤进行: 确认方法是否存在 确认方法的参数类型和顺序是否正确 确认调用…

    Java 2023年5月27日
    00
  • java LeetCode刷题稍有难度的贪心构造算法

    Java LeetCode刷题稍有难度的贪心构造算法攻略 在LeetCode刷题过程中,贪心算法在构造类问题中经常发挥着非常强大的作用。本篇文章将介绍贪心构造算法的基本思想和常见的实现模式,并给出两个例题作为说明。 概述 贪心构造算法指的是在求解最优解的过程中,每一步都采取当前状态下最优的选择。该算法通常适用于满足贪心选择性质的问题中,即问题能够分解成若干个…

    Java 2023年5月26日
    00
  • 面向对象编程依赖注入详解

    面向对象编程依赖注入详解 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种在面向对象编程中,将类间依赖关系的创建和管理权交给其他专门的类来处理的技术。通俗的说,就是让调用类摆脱创建和管理被调用类对象的束缚,将创建和管理依赖对象的工作交给容器来完成。 DI的优点 降低了系统模块间的耦合度。 可以提高模块的可重用性、可测试性和…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部