`
sillycat
  • 浏览: 2539167 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Monitor Directories and File(II)Timer and commons-vfs

阅读更多
Monitor Directories and File(II)Timer and commons-vfs

1. Timer and TimerTask
The Interface FileChangeListener.java:
package com.xxxx.importdata.filemonitor.timer;
public interface FileChangeListener
{
public void fileChanged(String filename);
}
The ClassFileChangeListener.java:
package com.xxxxx.importdata.filemonitor.timer;
public class ClassFileChangeListener implements FileChangeListener {
public void fileChanged(String filename) {
System.out
.println("File " + filename + " modified ,it must  reload  !");
}
}
The most import class FileMonitor.java:
package com.xxxxx.importdata.filemonitor.timer;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
public class FileMonitor
{
    private static final FileMonitor     instance = new FileMonitor();
    private Timer                        timer;
    private Map<String, FileMonitorTask> timerEntries;
    private FileMonitor()
    {
        this.timerEntries = new HashMap<String, FileMonitorTask>();
        this.timer = new Timer();
    }
    public static FileMonitor getInstance()
    {
        return instance;
    }
    public void addFileChangeListener(FileChangeListener listener, String filename, long period)
    {
        this.removeFileChangeListener(filename);
        FileMonitorTask task = new FileMonitorTask(listener, filename);
        this.timerEntries.put(filename, task);
        // schedule(TimerTask task,long delay,long period)
        // schedule(TimerTask task,long delay)
        // schedule(TimerTask task,Date time)
        // schedule(TimerTask task,Date firstTime,long period)
        this.timer.scheduleAtFixedRate(task, period, period);
    }
    public void removeFileChangeListener(String filename)
    {
        FileMonitorTask task = (FileMonitorTask) this.timerEntries.remove(filename);
        if (task != null)
        {
            task.cancel();
        }
    }
    private static class FileMonitorTask extends TimerTask
    {
        private FileChangeListener listener;
        private String             filename;
        private File               monitoredFile;
        private long               lastModified;
        public FileMonitorTask(FileChangeListener listener, String filename)
        {
            this.listener = listener;
            this.filename = filename;
            this.monitoredFile = new File(filename);
            if (!this.monitoredFile.exists())
            {
                return;
            }
            this.lastModified = this.monitoredFile.lastModified();
        }
        public void run()
        {
            long latestChange = this.monitoredFile.lastModified();
            if (this.lastModified != latestChange)
            {
                this.lastModified = latestChange;
                this.listener.fileChanged(this.filename);
            }
        }
    }
    public static void main(String[] args)
    {
        String path = "/home/luohua/tmp/t1.txt";
        //String path = "/home/luohua/life/work/xxxxx/xxxx-gen/records/";
        FileMonitor.getInstance().addFileChangeListener(new ClassFileChangeListener(), path, 2000);
    }
}

I am using Linux system, I notice that this lastModified can only detect the file changes. But if there are some changes in the
sub directory. It can not detect that.

And one more thing, it is said that the Timer will cost a lot. I will check if there is another better way.

2. commons-vfs
ivy.xml:
<dependency org="commons-vfs" name="commons-vfs" rev="1.0" />

the test java class is VFSMonitor.java:
package com.xxxxx.importdata.filemonitor.vfs;
import org.apache.commons.vfs.FileChangeEvent;
import org.apache.commons.vfs.FileListener;
import org.apache.commons.vfs.FileName;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemException;
import org.apache.commons.vfs.FileSystemManager;
import org.apache.commons.vfs.VFS;
import org.apache.commons.vfs.impl.DefaultFileMonitor;
public class VFSMonitor
{
    private static final String PATH = "/home/luohua/life/work/xxxxx/xxxx-gen/records/";
    public static void main(String[] args)
    {
        FileSystemManager fsManager = null;
        FileObject listendir = null;
        try
        {
            fsManager = VFS.getManager();
            listendir = fsManager.resolveFile(PATH);
        }
        catch (FileSystemException e)
        {
            e.printStackTrace();
        }
        DefaultFileMonitor fm = new DefaultFileMonitor(new FileListener() {
            public void fileCreated(FileChangeEvent event) throws Exception
            {
                monitor(event);
            }
            public void fileDeleted(FileChangeEvent event) throws Exception
            {
                monitor(event);
            }
            public void fileChanged(FileChangeEvent event) throws Exception
            {
                monitor(event);
            }
            private void monitor(FileChangeEvent event)
            {
                FileObject fileObject = event.getFile();
                FileName fileName = fileObject.getName();
                System.out.println(fileName + " has changed.");
            }
        });
        fm.setRecursive(true);
        fm.addFile(listendir);
        fm.start();
        try
        {
            Thread.sleep(1000000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        fm.stop();
    }
}

references:
http://www.iteye.com/topic/1096698
http://www.blogjava.net/quaff/archive/2006/03/02/33229.html
分享到:
评论

相关推荐

    yolov10预训练模型.rar

    在按照YOLOv10官网上的步骤进行时,运行app.py文件时,如果没有预训练模型的话会报错。解压压缩包里的内容到同级目录下(在requirements.txt文档下面),这样运行后就不会报错。

    Linux Socket编程、IO模型及进程间通信的完整实用案例

    在IT领域,Linux系统是广泛应用于服务器和嵌入式设备的操作系统。对于系统开发者和管理员,深入理解Linux的Socket编程、IO模型以及进程间通信(IPC)是至关重要的。本资料包提供了三个主要部分的学习资源:`process_comm`涉及进程间通信,`linux_socket`涵盖Socket编程,而`io_mode`则讨论Linux的IO模型。接下来,我们将详细探讨这些关键知识点。 让我们来看看**Linux Socket编程**。Socket是网络通信的基本接口,它允许两个或多个进程通过网络进行数据交换。在Linux中,Socket编程通常涉及到以下步骤:创建Socket,绑定IP地址和端口号,监听连接请求,接受连接,发送和接收数据,最后关闭Socket。`linux_socket`目录可能包含了示例代码,演示如何创建TCP或UDP Socket,处理并发连接,以及实现基本的错误处理机制。理解Socket编程有助于开发网络服务,如Web服务器、FTP服务器等。 我们来讨论**Linux IO模型**。在Linux中,有五种主要的IO模型:阻塞IO、非阻塞IO、IO复用(

    apsw-3.38.5.post1-cp310-cp310-win_amd64.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    aiohttp-3.6.2-cp35-cp35m-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    课设毕设基于SpringBoot+Vue的大学生创业项目的信息管理系统源码可运行.zip

    本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac

    计算机体系结构实验3 多cache一致性算法

    湖大计算机体系结构实验

    arctic-1.67.1-cp27-cp27m-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    Toad Data Modeler:Toad中数据字典的创建与管理.docx

    Toad Data Modeler:Toad中数据字典的创建与管理.docx

    #-ssm-048-mysql-在线读书与分享论坛-.zip

    前台: 用户读书笔记,心得查看,并且可以支持调用第三方组建,进行实时聊天 在线图书阅读,一本书里,有多个章节,阅读到某个章节,可以保存阅读进度,比如阅读第一章了,点击提交,可以存储阅读进度,在个人后台查看阅读进度 用户注册 后台: 管理员: 管理员用户管理 注册用户管理 书籍类别管理 书籍信息管理 阅读进度管理 分享阅读心得,笔记管理 系统管理 注册用户: 个人资料修改 分享阅读心得,笔记(下拉表,选择类别) 个人阅读进度查看

    SolarWinds数据库性能分析器:高级功能:SQL分析与优化.docx

    SolarWinds数据库性能分析器:高级功能:SQL分析与优化.docx

    电子商务之价格优化算法:动态定价:价格战与市场动态.docx

    电子商务之价格优化算法:动态定价:价格战与市场动态.docx

    apsw-3.30.1.post1-cp35-cp35m-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    VB程序实例-MMControl控件播放多媒体文件.zip

    基于VB的程序实例,可供参考学习使用

    基于java的旅游推荐系统设计与实现答辩PPT.pptx

    基于java的旅游推荐系统设计与实现答辩PPT.pptx

    原版atom-0.10.0-cp311-cp311-win_arm64.whl-下载即用直接pip安装.zip

    安装前的准备 1、安装Python:确保你的计算机上已经安装了Python。你可以在命令行中输入python --version或python3 --version来检查是否已安装以及安装的版本。 个人建议:在anaconda中自建不同python版本的环境,方法如下(其他版本照葫芦画瓢): 比如创建python3.8环境,anaconda命令终端输入:conda create -n py38 python==3.8 2、安装pip:pip是Python的包管理工具,用于安装和管理Python包。你可以通过输入pip --version或pip3 --version来检查pip是否已安装。 安装WHL安装包 1、打开命令行(或打开anaconda命令行终端): 在Windows上,你可以搜索“cmd”或“命令提示符”并打开它。 在macOS或Linux上,你可以打开“终端”。 2、cd到whl文件所在目录安装: 使用cd命令导航到你下载的whl文件所在的文件夹。 终端输入:pip install xxx.whl安装即可(xxx.whl指的是csdn下载解压出来的whl) 3、等待安装完成: 命令行会显示安装进度,并在安装完成后返回提示符。 以上是简单安装介绍,小白也能会,简单好用,从此再也不怕下载安装超时问题。 使用过程遇到问题可以私信,我可以帮你解决! 收起

    astropy-5.0.4-cp38-cp38-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    aggdraw-1.3.14-cp39-cp39-win_amd64.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    VB程序实例-控件随着窗口大小按比例变化.zip

    基于VB的程序实例,可供参考学习使用

    基于Java Swing实现的飞机大战游戏.zip

    《基于Java Swing实现的飞机大战游戏》是一份旨在帮助学习者掌握Java编程和游戏开发的资源。该资源通过一个完整的飞机大战游戏实例,展示了如何使用Java语言结合Swing库进行桌面应用程序开发。本资源不仅包含详细的源码,还提供了相关文档、课程设计报告及视频教程,适合作为计算机科学与技术、软件工程等专业的课程设计或毕业设计项目。游戏功能包括玩家控制飞机移动、自动发射子弹、敌机随机出现与移动、碰撞检测以及游戏得分计算等。此外,还加入了背景音乐和音效,增强了游戏体验。通过多线程技术确保游戏流畅运行,同时采用面向对象编程思想构建了清晰的项目结构。总之,《基于Java Swing实现的飞机大战游戏》是一个理想的学习工具,它能够帮助初学者深入理解Java GUI编程和事件处理机制,同时也为有经验的开发者提供了实战演练的机会。

    基于SpringBoot整合WebSoket完整源码分享给需要的同学

    **正文** 在现代Web开发中,实时通信是一个重要的需求,SpringBoot框架提供了与WebSocket的集成,使得开发者可以方便地在应用程序中实现双向通信。本文将深入探讨如何在SpringBoot项目中整合WebSocket,以及相关的概念和技术。 WebSocket协议是HTML5引入的一种在单个TCP连接上进行全双工通信的协议,它允许服务器主动向客户端推送数据,极大地提高了实时性。而SpringBoot作为Spring框架的轻量级版本,简化了配置和启动流程,使得开发WebSocket应用变得更加便捷。 我们需要在`pom.xml`中添加SpringBoot WebSocket的相关依赖。SpringBoot默认集成了Spring Websocket,我们只需要引入`spring-boot-starter-websocket`模块即可: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId

Global site tag (gtag.js) - Google Analytics