博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java文件监控[转]
阅读量:5918 次
发布时间:2019-06-19

本文共 3336 字,大约阅读时间需要 11 分钟。

原文链接:

问题:

存在两个文件目录,且称之为源目录和目标目录,需要不定期将源目录和目标目录进行同步。
两种同步方法:
1 采用从源目录到目标目录的完全拷贝覆盖。显而易见的缺点,当文件目录中文件多、体积大时拷贝过程时间消耗极大。
2 采用从源目录到目标目录的变更集拷贝覆盖。避免了大量拷贝的IO耗时操作,但产生了新的问题:如何获取变更信息?
新问题:
如何监控一个文件目录的变更情况。
还是两种方法:
1 扫描式。不定期对源目录进行轮循扫描,获取变更。弱点:同样的,文件目录中文件多、体积大时扫描耗时久,响应也慢。
2 事件驱动式。当源目录发生变更时,抛出变更事件。JNI和JNotify可以提供支持,据说JDK 7内置支持,不过咱公司还没用上。
JNotify相关介绍:
JNotify:http://jnotify.sourceforge.net/,通过JNI技术,让Java代码可以实时的监控制定文件夹内文件的变动信息,支持Linux/Windows/MacOS。 
JNotify的准备:
在使用JNotify之前,你需要“安装”一下JNotify,分为两个部分:jnotify-lib-0.93.jar和jnotify.dll/jnotify_64bit.dll。
jar自然设计类路径即可,dll则放置在java.library.path所指向的文件夹中。
java.library.path的值可以在java程序中通过如下语句:
System.getProperty("java.library.path")
查看,一般在windows下放在[jre安装目录]/bin下即可;
也可以手动指定程序的启动参数: 
java -Djava.library.path=[dll路径]
的方法来达到目的;
也可以在java程序中通过如下语句:
System.load("xxxx/jnotify.dll")
来加载dll,这个可以方便程序打包。
JNotify使用了JNI技术来调用系统的本地库(Win下的是dll文件,Linux下是so文件),dll放置不正确,会有如下报错: 
java.lang.UnsatisfiedLinkError: no jnotify in java.library.path  
    at java.lang.ClassLoader.loadLibrary(Unknown Source)  
    at java.lang.Runtime.loadLibrary0(Unknown Source)  
    at java.lang.System.loadLibrary(Unknown Source)  
    at net.contentobjects.jnotify.win32.JNotify_win32.<clinit>(Unknown Source)  
    at net.contentobjects.jnotify.win32.JNotifyAdapterWin32.<init>(Unknown Source)  
JNotify使用示例:

package com.dancen.test;import net.contentobjects.jnotify.JNotify;import net.contentobjects.jnotify.JNotifyListener;public class FileWatch {    public static void main(String[] args)    {        try        {            new FileWatch().sampleTest();        }        catch (Exception e)        {            e.printStackTrace();        }    }        public void sampleTest() throws Exception    {        // path to watch        String path = "D:\\download";        // watch mask, specify events you care about,        // or JNotify.FILE_ANY for all events.        int mask = JNotify.FILE_CREATED                | JNotify.FILE_DELETED                | JNotify.FILE_MODIFIED                | JNotify.FILE_RENAMED;        // watch subtree?        boolean watchSubtree = true;        // add actual watch        int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());        // sleep a little, the application will exit if you        // don't (watching is asynchronous), depending on your        // application, this may not be required        Thread.sleep(1000000);        // to remove watch the watch        boolean res = JNotify.removeWatch(watchID);                if (!res)        {            // invalid watch ID specified.        }    }    class Listener implements JNotifyListener     {        public void fileRenamed(int wd, String rootPath, String oldName, String newName)         {            print("renamed " + rootPath + " : " + oldName + " -> " + newName);        }        public void fileModified(int wd, String rootPath, String name)        {            print("modified " + rootPath + " : " + name);        }        public void fileDeleted(int wd, String rootPath, String name)        {            print("deleted " + rootPath + " : " + name);        }        public void fileCreated(int wd, String rootPath, String name)        {            print("created " + rootPath + " : " + name);        }        void print(String msg)         {            System.err.println(msg);        }    }}

 

转载于:https://www.cnblogs.com/lnlvinso/p/3971834.html

你可能感兴趣的文章
《点睛:ActionScript3.0游戏互动编程》——1.3 HSB模式及其与RGB间的转换
查看>>
创建和发布 Android 开发库的终极指南
查看>>
《Android NFC开发实战详解》——6.2节Android NFC P2P开发基础
查看>>
《重构与模式(修订版)》—第1章1.2节模式万灵丹
查看>>
保存138亿年?!5维磁盘在南安普顿大学研制成功
查看>>
当你拷贝数据,你会想起谁
查看>>
notepad++ 使用
查看>>
架构设计四种基本套路
查看>>
C++语言基础 例程 二进制文件应用案例
查看>>
【SQL】SQL Server 2012 手动安装帮助文档+排错
查看>>
Java泛型type体系
查看>>
【原】使用iScroll.js解决ios4下不支持position:fixed的问题
查看>>
定制并发类(三)实现一个基于优先级的Executor类
查看>>
Lua 函数用法和它的"诡异"之处
查看>>
MFC学习笔记之四(音乐,文字输出,障碍物,弹窗)
查看>>
Java IO 之 OutputStream源码
查看>>
【设计模式】责任链4-链接链
查看>>
Android中SQLite应用详解
查看>>
VS2012 反汇编
查看>>
企业网站建设为何选择动态网页设计
查看>>