- 浏览: 679496 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (181)
- Matlab (16)
- Java (26)
- autoHotkey (4)
- openCV (1)
- C++ (50)
- PDF-XChange Viewer (2)
- 学术 (11)
- javascript (4)
- linux (11)
- SWT (9)
- latex (7)
- GAE (2)
- windows (6)
- C# (3)
- PS (20)
- JNI (4)
- latex,批处理 (0)
- 批处理 (4)
- Android (5)
- 矩阵论 (1)
- SVM (1)
- 概率图模型 (0)
- Python (12)
- Eigen (5)
- 编程题 (1)
- MKL (1)
- 神经网络 (9)
- 最优化 (2)
- 摄影 (1)
- PPT (0)
- After Effects (3)
- CUDA (3)
- caffe (0)
- MXNet (2)
- svn (1)
- R (0)
- 虚拟机 (0)
- tensorflow (7)
- theano (1)
- Keras (1)
- vim (1)
- xgboost (1)
- spark (6)
- eclipse (2)
- word2vec (0)
- hadoop (1)
- dmlc (1)
- git (0)
最新评论
-
jeffersonz:
请问大神,这个插件记录下来的脚本为什么不能再Extendscr ...
PhotoShop - 记录PS的所有操作为JavaScript代码 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道cherish ...
Eigen的编译选项;MKL的使用 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道 您好,您的工 ...
Eigen的编译选项;MKL的使用
java7的文件夹监控真是太烂了,折腾了一天,封装的差不多了,结果还是没有jnotify好用!!! (java7在递归子文件夹目录时貌似原理上有问题,应该真的就是每个文件夹单独注册监听事件吧,所以在拷贝整个文件夹到所监听的目录时,由于还没注册好监听事件,有些文件的创建事件根本无法监听到)!!!
虽然还得加额外的dll,还是用jnotify吧~~,
jnotify网址:http://jnotify.sourceforge.net/
当然,java7可以很好地控制监控的文件夹(不一定整个目录树都得监控不是,自己筛选挺方便)
java7的文件夹监控官方教程:http://docs.oracle.com/javase/tutorial/essential/io/notification.html
以下程序改自官方教程,主要是对事件进行了整合(原本更改文件名称被分为了两个事件delete+create,诸如此类):
虽然还得加额外的dll,还是用jnotify吧~~,
jnotify网址:http://jnotify.sourceforge.net/
当然,java7可以很好地控制监控的文件夹(不一定整个目录树都得监控不是,自己筛选挺方便)
java7的文件夹监控官方教程:http://docs.oracle.com/javase/tutorial/essential/io/notification.html
以下程序改自官方教程,主要是对事件进行了整合(原本更改文件名称被分为了两个事件delete+create,诸如此类):
import static java.nio.file.LinkOption.NOFOLLOW_LINKS; import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; import static java.nio.file.StandardWatchEventKinds.OVERFLOW; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.WatchEvent; import java.nio.file.WatchEvent.Kind; import java.nio.file.WatchKey; import java.nio.file.WatchService; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.HashMap; /* * java7文件夹监控程序的封装。 * version: 2012_04_03 */ public final class DirWatcher { public static interface WatchEventHandler { void handleEvent(KeyState event); } /** * 记录操作类型 * */ static enum OperationType { /** * @author LC 调整 */ Modify { @Override public String toString() { return "Modify"; } }, /** * @author LC 新建 */ Create { @Override public String toString() { return "Create"; } }, /** * @author LC 删除 */ Delete { @Override public String toString() { return "Delete"; } }, /** * @author LC 空事件 */ Null { @Override public String toString() { return "Null"; } }, /** * @author LC 重命名 */ Rename { @Override public String toString() { return "Rename"; } }, /** * @author LC 没用到 */ Move { @Override public String toString() { return "Move"; } } } /** * 记录{@link WatchKey}及事件的状态类 */ class KeyState { /** * 事件发生的路径或者{@link WatchKey}对应的路径 */ public Path path; /** * {@link WatchKey}上一步操作的路径或者重命名事件中的重命名后的名称 */ public Path exPath; /** * 事件的类型 */ public OperationType opType = OperationType.Null; /** * {@link WatchKey}的等级或者引发事件的{@link WatchKey}的等级 */ public int level; /** * 事件发生的事件 */ public long opTime = -1; /** * @param path * 事件发生的路径或者{@link WatchKey}对应的路径 * @param level * {@link WatchKey}的等级或者引发事件的{@link WatchKey}的等级 */ public KeyState(Path path, int level) { this.path = path; this.level = level; } /** * @param path * 事件发生的路径或者{@link WatchKey}对应的路径 * @param opType * 操作的类型 * @param level * {@link WatchKey}的等级或者引发事件的{@link WatchKey}的等级 */ public KeyState(Path path, OperationType opType, int level) { this.path = path; this.level = level; this.opType = opType; } /** * @param path * 事件发生的路径或者{@link WatchKey}对应的路径 * @param opType * 操作的类型 * @param level * {@link WatchKey}的等级或者引发事件的{@link WatchKey}的等级 * @param opTime * 事件发生的时间 */ public KeyState(Path path, OperationType opType, int level, long opTime) { super(); this.path = path; this.opType = opType; this.level = level; this.opTime = opTime; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("opType=" + opType); sb.append("\topTime=" + opTime); sb.append("\tlevel=" + level); if (path != null) sb.append("\tpath=" + path.normalize()); if (exPath != null) sb.append("\texPath=" + exPath.normalize()); return sb.toString(); } } private Path pathToMonitor; private WatchService ws; /** * 是否监控子目录树 */ private boolean watchSubDir = false; /** * 存储键值对应的路径等信息 */ private HashMap<WatchKey, KeyState> keyMap = new HashMap<>(); /** * 监控的最大层级 */ private int maxLevel = 100; /** * 是否输出调试信息 */ static boolean debug = true; /** * 处理事件的函数类 */ private WatchEventHandler eventHandler; private static final WatchEventHandler nullHandler = new WatchEventHandler() { @Override public void handleEvent(KeyState event) { if (!debug) { System.out.println(event); System.out.println(); } } }; /** * 演示用 * * @param pathToMonitor * @param watchSubDir */ public DirWatcher(Path pathToMonitor, boolean watchSubDir) { this.pathToMonitor = pathToMonitor; this.watchSubDir = watchSubDir; try { ws = FileSystems.getDefault().newWatchService(); if (watchSubDir) registerAll(pathToMonitor, maxLevel); else register(pathToMonitor, 0); } catch (IOException e) { e.printStackTrace(); } eventHandler = nullHandler; } public DirWatcher(Path pathToMonitor, boolean watchSubDir, int maxLevel, WatchEventHandler eventHandler) { super(); this.pathToMonitor = pathToMonitor; this.watchSubDir = watchSubDir; this.maxLevel = maxLevel; this.eventHandler = eventHandler == null ? eventHandler : nullHandler; } @SuppressWarnings("unchecked") static <T> WatchEvent<T> cast(WatchEvent<?> event) { return (WatchEvent<T>) event; } /** * 注册{@link WatchService} * * @param pathToMonitor * 需要被监控的目录 * @param level * 相对于最上层的要监控的目录的等级,如d:\test为第0级,则d:\test\folder则为1级 * @throws IOException */ private void register(Path pathToMonitor, int level) throws IOException { WatchKey key = pathToMonitor.register(ws, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); // System.out.println(key + "\t注册key," + dir.toFile().getAbsolutePath()); if (debug) { KeyState prev = keyMap.get(key); if (prev == null) { System.out.format("-->\tregister: %s\tregisted level=%d\n", pathToMonitor, level); } else { if (!pathToMonitor.equals(prev.path)) { System.out.format( "-->\tupdate: %s -> %s\tregisted level=%d\n", prev, pathToMonitor, level); } } } KeyState prev = keyMap.get(key); if (prev == null) keyMap.put(key, new KeyState(pathToMonitor, level)); else { prev.path = pathToMonitor; prev.level = level; } } /** * 监控一个目录及其子目录 * * @param curPath * 要被监控的目录 * @param maxLevel * 监控的等级数量 * @throws IOException */ private void registerAll(final Path curPath, final int maxLevel) throws IOException { registerAll(curPath, 0, maxLevel); } /** * 监控一个目录及其子目录 * * @param curPath * 要被监控的目录 * @param curLevel * 当前目录相对于最上层的要监控的目录的等级,如d:\test为第0级,则d:\test\folder则为1级 * @param maxLevel * 监控的等级数量,curLevel<maxLevel时,才进行监控 * @throws IOException */ private void registerAll(final Path curPath, final int curLevel, final int maxLevel) throws IOException { Files.walkFileTree(curPath, new SimpleFileVisitor<Path>() { int curLv = curLevel; @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { if (curLv < maxLevel) register(dir, curLv); ++curLv; if (curLv < maxLevel) { return FileVisitResult.CONTINUE; } else { return FileVisitResult.SKIP_SUBTREE; } } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { --curLv; return super.postVisitDirectory(dir, exc); } }); } /** * 开始监控,事件的处理分为两类 * <p> * 1、对重命名或新增的文件夹的监控,由Oracle的示例完成。 * <p> * 2、文件夹、文件的删除、重命名、新建事件;对于这类事件,Java7处理的不好,会有重复的,对此进行了封装。原理是根据事件发生的顺序及时间间隔来判断 * ,如同一个key的删除接着一个新建实际上为重命名事件 * <p> * 存在的问题:由于Java7系统函数的问题,当把一个含有文件的目录拷贝到监控中的目录时,有些文件无法扫描到!!!!(子目录的监控没有问题) * */ public void startMonitorDir() { new Thread(new Runnable() { @Override public void run() { while (true) { // 等待监控的事件的发生 WatchKey key; try { key = ws.take(); } catch (InterruptedException e) { e.printStackTrace(); return; } //事件的有效性检测 KeyState stateOrigin = keyMap.get(key); Path dir = stateOrigin.path; if (dir == null) { System.err.println("WatchKey not recognized!!"); } // int keyEventCount = 0; ArrayList<KeyState> eventList = new ArrayList<>(); for (WatchEvent<?> event : key.pollEvents()) { Kind<?> kind = event.kind(); // 遇到了不关心的事件 if (kind == OVERFLOW) { continue; } ++keyEventCount; // 获取文件路径 WatchEvent<Path> ev = cast(event); Path name = ev.context();//相对路径 Path child = dir.resolve(name);//绝对路径 //增加到事件队列中 KeyState eventState = new KeyState(child, stateOrigin.level);//不使用level字段 eventState.opTime = System.currentTimeMillis(); if (kind == ENTRY_CREATE) { eventState.opType = OperationType.Create; } else if (kind == ENTRY_DELETE) { eventState.opType = OperationType.Delete; } else if (kind == ENTRY_MODIFY) eventState.opType = OperationType.Modify; eventList.add(eventState); //事件的信息 if (debug) System.out.format("%d:%s: %s\n", keyEventCount, event.kind().name(), child); // 如果有新的子目录被创建(或者其他目录更名为该目录),则加入新的子目录到监控列表中 if (watchSubDir && (kind == ENTRY_CREATE)) { try { if (Files.isDirectory(child, NOFOLLOW_LINKS)) { if (debug) System.out.println(key + "\t原始key," + keyMap.get(key)); registerAll(child, stateOrigin.level + 1, maxLevel); } } catch (IOException e) { //e.printStackTrace(); } } } //分析事件队列,获取正确的事件 if (eventList.size() == 1) { KeyState state = eventList.get(0); processEvent(key, state); } else if (eventList.size() > 1) { KeyState eventStart; final int size = eventList.size(); for (int i = 0; i < size; i++) { eventStart = eventList.get(i); if (i + 1 < size) { KeyState eventEnd = eventList.get(i + 1); //重命名,先删除再创建 if (eventStart.opType == OperationType.Delete && eventEnd.opType == OperationType.Create) { eventStart.opType = OperationType.Rename; eventStart.exPath = eventEnd.path; processEvent(key, eventStart); ++i; for (int j = i + 1; j < size; j++) {//过滤掉紧跟的modify事件 KeyState tmp = eventList.get(j); if (tmp.path.equals(eventStart.exPath)) i++; } } else { processEvent(key, eventStart); for (int j = i + 1; j < size; j++) {//过滤掉紧跟的modify事件 KeyState tmp = eventList.get(j); if (tmp.path.equals(eventStart.path)) i++; } } } else processEvent(key, eventStart); // if(i+1>=size||evtList.get(i+1).lastOpType!=) } } if (debug) System.out.println(); // reset key and remove from set if directory no longer accessible boolean valid = key.reset(); if (!valid) { keyMap.remove(key); // all directories are inaccessible if (keyMap.isEmpty()) { break; } } } } }).start(); } /** * 处理事件,仍需要进行过滤 * * @param key * @param event */ private void processEvent(WatchKey key, KeyState event) { KeyState keyState = keyMap.get(key); if (event.opType != OperationType.Modify || !event.path.equals(keyState.exPath) || keyState.opTime - event.opTime > 200) {//同一文件的两个modify时间过短,过滤掉一个(之前也有过滤,但中间可能插入了文件夹的modify事件);注意keyState中exPath是事件记录,path是监控的文件夹路径 if (event.opType != OperationType.Modify || !Files .isDirectory(event.path, LinkOption.NOFOLLOW_LINKS)) {//过滤文件夹的modify事件,毕竟文件夹modify是因为文件夹下的文件的改变,已经有对应事件了!!!当然,理论上应该再检测一下文件夹是否处于监控列表中,懒得写了,反正都打算用jnotify了!!! if (debug) System.out.println("key=" + key.hashCode() + "\t" + event); eventHandler.handleEvent(event); } } keyState.exPath = event.opType == OperationType.Rename ? event.exPath : event.path;//作为上一步操作的文件进行记录 keyState.opTime = event.opTime; } public static void main(String[] args) { DirWatcher watcher = new DirWatcher(Paths.get("D:\\test2"), true); watcher.startMonitorDir(); } }
发表评论
-
lambda表达式
2014-08-20 21:47 1875仅作备忘,要学习还是看给的链接吧 1、C++ 中文介绍:htt ... -
利用Doxygen生成C++、Java文档
2013-04-08 16:15 4383示例程序、配置文件及doxygen常见参数文字版参见本文附件 ... -
删除citeulike导出的bib文件中的中文字符,使之能在WinEdt中读取
2012-12-06 18:57 1771在使用Citeulikehttp://citeulike.or ... -
使用jsoup分析网页
2012-12-05 16:12 2648之前用过HTMLParser,许久不更新的东西了,印象中也没那 ... -
JNI中基本类型数组的传递方法(无需拷贝数据!!!)
2012-10-23 17:11 182420、先来看一下主要用到哪些函数: GetIntArrayEle ... -
swig--在java、C#中调用c++写的DLL(以vs2012配置为例)
2012-10-02 22:06 70521、下载、安装: 到http://www.swig.org/d ... -
GAE学习笔记——静态文件、资源文件;GAE中使用velocity模板
2012-07-13 21:49 1409参考资料:https://developers.google. ... -
Google application engine 的Eclipse配置方法
2012-07-11 19:52 15161、安装google的eclipse插件 到https://d ... -
javadoc命令
2012-04-06 14:54 1358以下内容引用自(原文更全):http://hi.baidu.c ... -
SWT学习笔记——JFace中TableViewer的使用及注意事项
2012-04-01 15:26 3375问题: 1、使用CellEditor ... -
SWT学习笔记——JFace中TableViewer的使用及注意事项
2012-04-01 14:52 0问题: 1、使用CellEditor时出现org.eclips ... -
SWT学习笔记——SWT、JFace的配置(含源代码、javadoc的获取)
2012-04-01 14:08 2436具体的可以看官方的http://wiki.eclipse.or ... -
SWT学习笔记7——组件背景图片,鼠标事件,鼠标样式
2012-03-31 11:00 3653import org.eclipse.swt.grap ... -
SWT学习笔记6——Shell相关的事件
2012-03-31 10:23 1494这里有详细的事件列表:http://blog.csdn.net ... -
SWT学习笔记5——简易的多标签文本编辑器
2012-03-30 22:18 2245import java.io.BufferedRead ... -
SWT学习笔记4——系统托盘 system tray
2012-03-30 15:59 1531import org.eclipse.swt.widg ... -
SWT学习笔记3——颜色、字体、图片
2012-03-30 09:41 5795import org.eclipse.swt.gra ... -
SWT笔记2——测试UI线程的事件处理
2012-03-29 21:36 1373import org.eclipse.swt.widg ... -
SWT笔记1,组件的关系,屏幕信息
2012-03-29 21:20 1390import org.eclipse.swt.widg ... -
Linux JDK安装
2012-01-14 09:41 0引用 安装linux后会自动安装一个低版本的JDK,有时需要升 ...
相关推荐
基于jdk7或以上java版本的文件夹大小统计功能实现,相对于传统的java获取文件再计算大小的方式要快速很多,支持统计指定类型,是否统计子文件夹
用java语言编写的ftp小工具,可以按指定时间监控ftp服务器,把服务器指定目录内新产生的文件或者文件夹下载到本地指定文件夹,下载后删除数据。 也可以监控本地文件夹,把文件夹内新产生的文件或者文件夹整体上传到...
监控某一文件夹下文件状态包括增加、修改、删除,每隔5s检查一次
项目里用到的临时写的代码,反复对某文件夹里的文件做出同一动作使用
Java监控目录文件夹程序,用Java写的简单目录监视系统,每5秒会自动扫描一次被监视的文件夹,可让用户了解该目录中文件大小及文件增减数目的变化。
java写的ftp,下载上传文件,定时监控下载上传,自动解压加压,
java 代码仅供参考学习! java实现文件监控小工具 ...用于代码审计时监控文件夹内文件的变动,支持Mac,Windows,Linux。 第一次运行时请根据提示在此页面下载对应动态依赖库放到指定位置即可(注意版本!)。
java实现的一个监控windows文件夹中的文件的增删改等操作,根据不同的需要修改代码,可以做成不同的功能,如文件检索,文件保护,文件自动加密等程序应用
本篇文章主要介绍了java使用WatchService监控文件夹示例的资料,这里整理了详细的代码,有需要的小伙伴可以参考下。
本文中主要陈述一种实时监听文件夹中是否有文件增加的功能,可用于实际文件上传功能的开发。本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
系统文件夹: 获取系统特殊文件加的路径和图标。 系统快捷方式: 管理系统快捷方式。 系统相关信息: 收集系统CPU,内存,环境变量等相关信息。 系统会话: 提供关机,休眠,重启,注销等功能。 系统IO及网络功能: ...
通过java代码利用JNotify工具实现监控一个文件夹下的文件或者文件夹的动态变化,资料包含文件代码,maven依赖,dll动态库(win和linux)
懒得写了,总是上传失败。 公司业务写的一个小工具。
java 读取远程共享文件,一个操作简单的读取远程资源的控件。
文献综述 计算机科学与技术 基于 java 的远程监控系统的设计与实现 一、前言 近年来,随着计算机及网络的应用普及,千千万万的人们在娱乐、通讯、学习、工作等 各方面都实现了前所未有的信息化,极大地提高了生活...
用java写的远程监控软件,包括远程cmd命令,屏幕监控,摄像头操作,键盘钩子,远程注册表操作,以及文件的上传下载. 其中使用了一下第三方的开源jar包和dll文件,不是跨平台的,一些功能只能在windows上使用. 基本...
用java写的远程监控软件,包括远程cmd命令,屏幕监控,摄像头操作,键盘钩子,远程注册表操作,以及文件的上传下载. 其中使用了一下第三方的开源jar包和dll文件,不是跨平台的,一些功能只能在windows上使用. 基本...
远程监控软件一般分两个部分:一部分是客户端程序Client,另一部分是服务器端程序Server,由于本毕业设计的通信模块有别于传统的远程监控软件,...基于Java的后端远程系统软件的实现源码实现,适合计算机专业的毕业设计
期末大作业,毕业设计 课程设计基于JAVA CS远程监控系统软件的实现(源代码+论文)。每到期末和毕业季,很多大四同学苦于没有参考的毕设资料,或者下载的资料不全、代码有问题,数据有问题等等,造成毕设出现问题影响...
基于springboot的文件夹监听和遗漏文件自动获取功能以及springboot编译的直接可运行的bat文件