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日

相关文章

  • Java中byte输出write到文件的实现方法讲解

    下面是Java中byte输出write到文件的实现方法的详细攻略。 简介 在Java中,我们可以使用 FileOutputStream 将byte数组输出到文件,实现byte数据的写入。这个过程需要以下步骤: 创建输出文件的 FileOutputStream 对象 写入数据到输出流中 关闭输出流 实现方法 Step 1:创建输出文件的FileOutputSt…

    Java 2023年5月26日
    00
  • 详解JWT token心得与使用实例

    以下是详解JWT token心得与使用实例的完整攻略。 什么是JWT JWT(JSON Web Token)是一种开放标准,定义了用于在网络应用程序间传递声明的一个紧凑、自包含的方式。JWT 这个标准定义了一种简洁且安全的方式,可以在各方之间传输包含各种信息的 JSON 对象。JWT 主要用于身份验证和授权。 JWT 的组成结构 一个 JWT token 由…

    Java 2023年5月20日
    00
  • JavaWeb利用邮箱帮用户找回密码

    下面我就详细讲解一下JavaWeb利用邮箱帮用户找回密码的完整攻略。 一、方案说明 JavaWeb中实现密码找回的方式有很多种,其中比较常见的一种方式就是利用邮箱来帮助用户找回密码。具体实现方式如下: 用户选择找回密码功能,并输入用户名/邮箱等信息; 服务器验证用户信息,并生成一个随机的字符串作为验证码; 服务器将该随机字符串拼接到找回密码链接中,并发送到用…

    Java 2023年6月15日
    00
  • jsp+servlet实现最简单的增删改查代码分享

    下面来详细讲解 JSP+Servlet 实现最简单的增删改查代码分享的完整攻略。 1. 准备工作 在开始编写代码之前,需要先准备好以下工具和环境: JDK 1.8 或以上版本 Tomcat 8 或以上版本 Eclipse 或其他 Java IDE 2. 创建项目 在 Eclipse 中创建新的动态 Web 项目,选择 Web Application 项目类型…

    Java 2023年6月15日
    00
  • Tomcat实现session共享(session 会话复制)

    要实现Tomcat的Session共享,有两种方式:一种是使用Session复制,一种是使用Session共享的方式。 使用Session复制实现Session共享 Session复制是一种将Session从一个Tomcat实例复制到另一个Tomcat实例的机制。这种机制中,在Tomcat集群中的每个节点上都有自己的Session副本。如果某个节点失效,则其…

    Java 2023年5月19日
    00
  • AjaxFileUpload+Struts2实现多文件上传功能

    下面就来详细讲解如何使用AjaxFileUpload和Struts2实现多文件上传功能。 环境说明 Struts2版本:2.5.20 AjaxFileUpload版本:1.1 JDK版本:1.8 准备工作 下载AjaxFileUpload插件,将其解压到项目中的WebRoot目录下的js文件夹中。 引入AjaxFileUpload插件: “`html “…

    Java 2023年5月20日
    00
  • 关于RequestMapping注解的作用说明

    关于@RequestMapping注解的作用说明 @RequestMapping注解是Spring框架中最常用的注解之一,它可以用来映射URL和处理HTTP请求,是控制器中的一个方法级别的注解。下面将详细介绍@RequestMapping的作用和使用说明。 基本作用 @RequestMapping注解用于将指定的URL映射到处理请求的控制器方法上。当请求UR…

    Java 2023年6月15日
    00
  • 24基于java的宠物医院管理系统

    项目背景 随着互联网的普及,已经和我们的生活不可分割;宠物渐渐的已经成为了我们的好朋友,宠物医院管理系统可以帮助用户合理的管理宠物,呵护宠物的健康,对宠物起到了一个健康监控的作用; 项目介绍 系统总体分为3个角色:分别是系统管理员;医生和用户;不能的角色拥有不同的功能权限,下面详细介绍:系统管理员: 系统设置 宠物管理 预约管理 日常健康 宠物档案管理 医院…

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