文档章节

Directory monitor

Nathans
 Nathans
发布于 2016/08/30 16:34
字数 656
阅读 20
收藏 0

Monitor directory changes

Quartz定时器 or Timer + Thread:开启线程定时去读取文件内容,查看文件内容是否发生变化,但对于文件内容过大或者过于复杂的(不推荐),或者通过定时检查文件的修改时间lastModifyTime,但是可能出现问题(不推荐),还有通过读取文件流生成MD5对应的MD5码,如果MD5不同则文件发生变化,对于大型文件也有问题,适合小文件。

JDK watch:使用JDK 7自带的 watch。

Commons-io.monitor:File Monitor - a component for monitoring file system events。

 

JDK watch

  有三种监听事件类型,ENTRY_CREATE、ENTRY_DELETE、ENTRY_MODIFY。Watch只能监控目录,而不能监听某个具体的文件,需手动实现监听具体的文件。如果直接监听文件,则会报错 NotDirectoryException。

public static void jdkWatchDirectory() {
		// define a folder root
		Path myDir = Paths.get("D:/deploy");
		try {
			WatchService watcher = myDir.getFileSystem().newWatchService();
			myDir.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
			WatchKey watckKey = watcher.take();

			while (true) {
				List<WatchEvent<?>> events = watckKey.pollEvents();
				for (WatchEvent event : events)
					if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY)
						System.out.println("Modify: " + event.context().toString());
				
			}
		} catch (Exception e) {
			System.out.println("Error: " + e.toString());
		}
	}

  使用JDK Watch方式监控Directory,当文件内容发生变更时,有可能会触发两次MODIFY。

 

Commons-io Monitor

Commons-io Monitor class as follows:

FileAlterationListener Interface: A listener that receives events of file system modifications.

public interface FileAlterationListener {

    /**
     * File system observer started checking event.
     *
     * @param observer The file system observer
     */
    void onStart(final FileAlterationObserver observer);

    /**
     * Directory created Event.
     * 
     * @param directory The directory created
     */
    void onDirectoryCreate(final File directory);

    /**
     * Directory changed Event.
     * 
     * @param directory The directory changed
     */
    void onDirectoryChange(final File directory);

    /**
     * Directory deleted Event.
     * 
     * @param directory The directory deleted
     */
    void onDirectoryDelete(final File directory);

    /**
     * File created Event.
     * 
     * @param file The file created
     */
    void onFileCreate(final File file);

    /**
     * File changed Event.
     * 
     * @param file The file changed
     */
    void onFileChange(final File file);

    /**
     * File deleted Event.
     * 
     * @param file The file deleted
     */
    void onFileDelete(final File file);

    /**
     * File system observer finished checking event.
     *
     * @param observer The file system observer
     */
    void onStop(final FileAlterationObserver observer);
}

 

FileAlterationListenerAdaptor:a dapter ,fileAlterationListener implementation that does nothing.rewrite required methods。

example 

public class FileListener extends FileAlterationListenerAdaptor {
	
    @Override  
    public void onFileChange(File file) {
    	if (file.getName().contains("mail_profile.xml")) {
    		// TODO do something
    	}
        System.out.println("Modify:" + file.getAbsolutePath());  
    }  
  
    @Override  
    public void onStart(FileAlterationObserver observer) {  
        super.onStart(observer);  
    }  
  
    @Override  
    public void onStop(FileAlterationObserver observer) {  
        super.onStop(observer);  
    }  
    
    public static void main(String[] args) throws Exception{    
        String targetDirectory = "D:\\deploy";    
        long listeningInterval = TimeUnit.SECONDS.toMillis(2);  
        FileAlterationObserver observer = new FileAlterationObserver(targetDirectory);
        observer.addListener(new FileListener());    
        FileAlterationMonitor monitor = new FileAlterationMonitor(listeningInterval, observer); 
        monitor.start();    
    }  
}

Monitor directory "d:\deploy" file changes. 如果想监听某类文件的变化,需要添加FileFilter。

/**
     * Construct an observer for the specified directory and file filter.
     *
     * @param directoryName the name of the directory to observe
     * @param fileFilter The file filter or null if none
     */
    public FileAlterationObserver(String directoryName, FileFilter fileFilter) {
        this(new File(directoryName), fileFilter);
    }

implementation

String targetDirectory = "D:\\deploy";       
long listeningInterval = TimeUnit.SECONDS.toMillis(2);    
IOFileFilter fileFilter = FileFilterUtils.and(
        		FileFilterUtils.fileFileFilter(),
        		FileFilterUtils.suffixFileFilter(".xml"),
                FileFilterUtils.nameFileFilter("mail_profile.xml"));
Collection<File> files = FileUtils.listFiles(new File(rootDir),fileFilter, TrueFileFilter.INSTANCE);
System.out.println(files);
FileAlterationObserver observerFilter = new FileAlterationObserver(targetDirectory, fileFilter);    
observerFilter.addListener(new FileListener());
FileAlterationMonitor monitor = new FileAlterationMonitor(listeningInterval, observerFilter );      
monitor.start();    

但是FileFilter没有生效,并且整个目录的文件变化都未触发事件。所以只能不加FileFilter,并且在onFileChange中判断需要监听的具体类型或具体某个文件。

 

 

© 著作权归作者所有

Nathans
粉丝 7
博文 18
码字总数 28409
作品 0
成都
程序员
私信 提问
Dubbo监控中心的介绍与简易监控中心的安装

监控中心服务接口调用统计报表的显示配置 Dubbo服务提供者和服务消费者中的spring配置文件中增加以下配置: 配置截图如下: 添加完以上配置后,重新构建部署Dub

Fyanghi
2016/03/28
556
2
跟我学习dubbo-Dubbo监控中心的介绍与简易监控中心的安装(7)

Dubbo 监控中心的介绍与简易监控中心的安装 监控中心服务接口调用统计报表的显示配置 1、 Dubbo 服务提供者和服务消费者中的 spring 配置文件中增加以下配置: 添加完以上配置后,重新构建部...

HI曲奇饼干
2016/01/12
1K
1
dubbo-monitor-simple 安装

这里根据源码下载、打包、安装。 前提:安装了git和maven;有一个注册中心,可以在本地安装一个zookeeper, 详见zookeeper安装。 在360网盘上传了一个压缩包:https://yunpan.cn/cuqA4GC2vqp...

隆回水哥
2015/12/30
970
0
Android Screen Monitor同步手机屏幕到PC

有时候我们需要在PC上显示真机的屏幕,Android的ADM只能静态的监听一桢图像,所以在Google Code上,Google提供了一个Android Screen Monitor工具来实时显示手机屏幕: http://code.google.c...

eclipse_xu
2014/11/25
0
0
dubbo源码学习笔记----monitor

核心类 针对于每个注册进来的URL有个对应的Monitor状态跟踪类,每个Monitor状态跟踪类,通过一个Listener进行绑定。 将这个Listener交给一个线程池定时拉取Monitor信息。 Monitor使用 Monito...

春哥大魔王的博客
2018/01/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前嗅教程:如何获取精准客源,提高销量

经常有人问嗅嗅,我是XX行业的,大数据能帮我做什么? • 可以给我带来客源吗? • 可以提高我的销量吗? • 可以增加我的利润吗? 今天嗅嗅就以生鲜供货为例,为大家讲一讲外卖平台那些事~...

forespider
25分钟前
1
0
浮窗插件

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>移动窗口</title> <style> body { margin: 0; padding: 0; width: 100%; height: 1000px; background: #eee; } /*示......

流年那么伤
29分钟前
2
0
关于 Jenkins master 共享 JENKINS_HOME 目录的实验

本文首发于:Jenkins 中文社区 作者:翟志军 审校:王冬辉,linuxsuren Jenkins master 的高可用是个老大难的问题。和很多人一样,笔者也想过两个 Jenkins master 共享同一个 JENKINS_HOME 的...

Jenkins中文社区
36分钟前
3
0
【重构】Spring Cloud OAuth 无Token调用源码封装

背景 重构-改善既有代码的设计,重构的目的是是软件更容易被理解和修改。 书接上回Spring Security OAuth 微服务内部Token传递的源码解析,本篇主要无token 调用过程中,代码的不断完善及其重...

冷冷gg
42分钟前
26
0
watchOS更新后 Apple Watch 4心电图功能已开始支持欧洲用户

苹果在发布 Apple Watch 4 系列时也发布了 ECG(心电图)功能,但这项功能仅适用于在美版 Apple Watch。对于其他地区的用户来说,访问该功能的唯一途径是在美国购买该设备。不过当 watchOS ...

linuxCool
51分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部