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);
}
}
}
java文件监控[转]的更多相关文章
- Java文件实时监控Commons-io
今天看到一网友写的 Java 文件监控,实时监控文件加载 ,突然想到Commons-io中已有此功能的实现,先温习下 写个简单的Demo: 有三种方式: 1.java common.io 内部实 ...
- java实现文件监控
文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...
- 关于 Java 性能监控您不知道的 5 件事,第 1 部分
责怪糟糕的代码(或不良代码对象)并不能帮助您发现瓶颈,提高 Java? 应用程序速度,猜测也不能帮您解决.Ted Neward 引导您关注 Java 性能监控工具,从5 个技巧开始,使用Java 5 ...
- Tomcat java zabbix 监控
排除汤姆猫错误的步骤 ps-ef | grep java或jps –lvm 查看java pid进程 netstat –lntup | grep java 查看java 端口有没有启动 查看 tomc ...
- Linux下Java性能监控
Linux下Java性能监控 一.JVM堆内存使用监控 获取thread dump的3种方法: 1)使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun. ...
- Java性能监控之Instrumentation
注:网上摘取的资料整理出来,供大家学习理解,希望有所帮助. 1.1. Instrumentation 简介 利用 Java 代码,即 java.lang.instrument 做动态 Ins ...
- Android开发笔记(4)——MainActivity.java文件修改&布局嵌套
笔记链接:http://www.cnblogs.com/igoslly/p/6805020.html 笔记以开发名为CoffeeOrder的app活动为线索,介绍app如何从功能设计→ ...
- Java程序监控---Metrics
概念 Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控 目前最为流行的 metrics 库是来自 Coda ...
- 老技术新谈,Java应用监控利器JMX(2)
各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期由于架不住来自于程序员内心的灵魂的拷问,于是我们潜心修炼,与 Java 应用监控利器 JMX 正式打了个照面. J ...
随机推荐
- hdu_1698Just a Hook(线段树)
hdu_1698Just a Hook(线段树) 标签: 线段树 题目链接 题意: 一个英雄的技能是发射一个长度为n的金属链,初始的金属链都是铁做的,标记为1,我们可以对于某个区间修改它的金属材质,如 ...
- Effective Java 第三版——23. 优先使用类层次而不是标签类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Xtrabackup实现数据的备份与恢复
Xtrabackup介绍 Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁): ...
- 全面理解Java内存模型
尊重原创:http://blog.csdn.net/suifeng3051/article/details/52611310 Java内存模型即JavaMemory Model,简称JMM.JMM定义 ...
- UEP-多任务
打开多任务 Function testTabTask(){ openTabTask(","多任务测试",$$pageContextPath+"/componen ...
- cesium编程入门(五)绘制形状
通过Entity添加形状 先来看一个添加立方体的例子 var viewer = new Cesium.Viewer('cesiumContainer'); var redBox = **viewer. ...
- Anaconda更新和第三方包更新
更新Anaconda和它所包含的包 1.打开cmd,切换到Anaconda的Scripts目录下:./Anaconda3/Scripts 2.更新Anaconda conda update conda ...
- thinkphp5自动完成
- PHP条件语句if的使用
方法/步骤 if(条件){是否执行的代码...}:这样的用法常用于判断单一条件,当然,可以可以用逻辑符号将多个条件组合成同一条件. if else语句:如果条件不成立,就会执行else后面{}里的代码 ...
- 紧急求助!配置SMTP插件出错,SMTP connect() failed
http://bbs.csdn.net/topics/390848222 我来挖个坟.我知道问题所在了,只要你们本地或服务器上环境中只要确保开启了php_openssl 跟 php_socket等扩展 ...