java文件监控[转]

原文链接:http://blog.csdn.net/dancen/article/details/7786987#comments

问题:
存在两个文件目录,且称之为源目录和目标目录,需要不定期将源目录和目标目录进行同步。
两种同步方法:
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);
        }
    }
}
时间: 2024-08-27 17:32:38

java文件监控[转]的相关文章

基于SSM框架下的JAVA文件监控管理系统

每天记录学习,每天会有好心情.*^_^* 今日思考,完成一个文件监控管理系统项目,需要实现哪些功能?此类项目常见描述如下:随着信息技术突飞猛进,网络传输已经成为信息传递的主要方式,信息极端主义的手段越来越高深莫测,重要信息的监控显得十分必要.针对信息安全隐患问题,本章设计了文件监控系统,来实现对传输的重要文件进行实时监控,达到安全传输文件以防非法窃取的目的.SSM(MYECLIPSE)框架及其适合本类项目,使用MVC的思想可以极大程度减少重复工作量.和SSM(MYECLIPSE)框架最配的开发工

Java 文件变化加载监控,实时监控文件加载之Commons-io

Java 文件监控,实时监控文件加载 ,Commons-io中已有此功能的实现,如下代码所示: package wy.util.filemonitor; import java.io.File; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import org.apache.commons.io.monitor.FileAlterationObserver; import org.apache.log4j

Java文件实时监控Commons-io

今天看到一网友写的 Java 文件监控,实时监控文件加载 ,突然想到Commons-io中已有此功能的实现,先温习下 写个简单的Demo: 有三种方式: 1.java common.io    内部实现是遍历的方式,小文件夹的效率还好,比如我测试60G的目录,就很慢很慢了.(我使用这个) 2.jdk 7 的watch service    //经测试基本不可用.在一个40g的很深的目录下去新建和删除文件5分钟都没结果.主要原因是需要对每一个Path进行注册监控. 3.jnotify       

Android文件监控FileObserver介绍

在前面的Linux文件系统Inotify机制中介绍了Linux对文件变更监控过程.Android系统在此基础上封装了一个FileObserver类来方便使用Inotify机制.FileObserver是一个抽象类,需要定义子类实现该类的onEvent抽象方法,当被监控的文件或者目录发生变更事件时,将回调FileObserver的onEvent()函数来处理文件或目录的变更事件. 事件监控过程 在FileObserver类中定义了一个静态内部类ObserverThread,该线程类才是真正实现文件

关于 Java 性能监控您不知道的 5 件事,第 1 部分

责怪糟糕的代码(或不良代码对象)并不能帮助您发现瓶颈,提高 Java? 应用程序速度,猜测也不能帮您解决.Ted Neward 引导您关注 Java 性能监控工具,从5 个技巧开始,使用Java 5 的内置分析器JConsole 收集和分析性能数据. 当应用程序性能受到损害时,大多数开发人员都惊慌失措,这在情理之中.跟踪 Java 应用程序瓶颈来源一直以来都是很麻烦的,因为 Java 虚拟机有黑盒效应,而且 Java 平台分析工具一贯就有缺陷. 然而,随着 Java 5 中 JConsole 的

Java性能监控之Instrumentation

注:网上摘取的资料整理出来,供大家学习理解,希望有所帮助. 1.1.      Instrumentation 简介 利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题.使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的

Linux下Java性能监控

Linux下Java性能监控 一.JVM堆内存使用监控 获取thread dump的3种方法: 1)使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>dumpHeap中,点击 dumpHeap按钮.生成的dump文件在java应用的根目录下面. 2)jmap -heap 1234 (1234为进程号) 3)cmd ->jvisualvm,远程连接,选择堆Dump生成he

Tomcat java zabbix 监控

排除汤姆猫错误的步骤 ps-ef | grep java或jps –lvm 查看java pid进程 netstat –lntup | grep java 查看java 端口有没有启动 查看 tomcat 日志 tailf /application/tomcat/logs/catalina.out show-busy-java-threads.sh 打印系统排名前五的java进程,查看那个进程占用内存高. tomcat java远程监控 下载jkd http://www.oracle.com/t

web文件监控系统

每天记录学习,每天会有好心情.*^_^* 今天记录的项目是基于web的文件监控系统,针对信息安全隐患问题,本章设计了文件监控系统,来实现对传输的重要文件进行实时监控,达到安全传输文件以防非法窃取的目的.采用当前非常流行的B/S体系结构,以JAVA作为开发技术,主要依赖SSM技术框架,mysql数据库建立本系统.做基于web的文件监控系统的时候,我们需要用到SSM(MYECLIPSE)框架,开发工具选用最拿手的MYECLIPSE.基于web的文件监控系统项目是一个 后台项目.开发系统时,需求分析是