`
zyp307
  • 浏览: 14709 次
  • 性别: Icon_minigender_1
  • 来自: 乌鲁木齐
社区版块
存档分类
最新评论

JAVA监听目录改变

    博客分类:
  • JAVA
 
阅读更多

目前为止,java没有提供自带的对文件目录改变的监听器。使用java自带的(如果是native的就更好了)会方便很多。

这要等到java 7的出现,见:http://tech.puredanger.com/java7#jsr203,jsr203对io的新扩展中,有:

A new filesystem interface that supports bulk access to file attributes, change notification, …

但是,目前一般的做法还是自己启动线程定时监控变化。带来的问题是目录文件和嵌套过多的时候性能会下降。

 

网上有一个现成的解决方案,提供了源代码下载:

http://twit88.com/blog/2007/10/02/develop-a-java-file-watcher/

可以简单的调用该类库,以下是每5秒钟监控一下指定目录的变化的示例:

public static void main(String[] args) {
// Monitor c:/temp every 5 seconds
DirectoryWatcher dw = new DirectoryWatcher(“c:/temp/”, 5);
dw.addListener(new FileListener());
dw.start();

其中的FileListener就是自定义的文件监听器。需要实现接口:

com.lightspeedleader.directorywatcher.IFileListener

可实现的方法包括:

/**
* Monitoring has just started on this new resource.
*
* @param monitoredResource the resource now being monitored.
*/
public void onStart(Object monitoredResource);

/**
* Monitoring has just ended on this new resource.
*
* @param notMonitoredResource the resource not being monitored anymore.
*/
public void onStop(Object notMonitoredResource);

/**
* Something has been added to this resource, or the resource itself has
* been added.
*
* @param newResource the new resource
*/
public void onAdd(Object newResource);

/**
* The resource has been changed.
*
* @param changedResource the changed resource
*/
public void onChange(Object changedResource);

/**
* Something has been added to this resource, or the resource itself has
* been added.
*
* @param deletedResource the deleted resource
*/
public void onDelete(Object deletedResource);
}

作者也给出了一个简单的实现:

public class FileListener extends BaseListener implements IFileListener {

/**
* Connstructor
*/
public FileListener() {
super();
}

public void onStart(Object monitoredResource) {
// On startup
if (monitoredResource instanceof File) {
File resource = (File) monitoredResource;
if (resource.isDirectory()) {

System.out.println(“Start to monitor ” + resource.getAbsolutePath());

/*File[] files = resource.listFiles();
for (int i = 0; i < files.length; i++) {
File f = (File) files[i];
onAdd(f);
}*/
}
}
}

public void onStop(Object notMonitoredResource) {

}

public void onAdd(Object newResource) {
if (newResource instanceof File) {
File file = (File) newResource;
if (file.isFile()) {
System.out.println(file.getAbsolutePath() + ” is added”);
}
}
}

public void onChange(Object changedResource) {
if (changedResource instanceof File) {
File file = (File) changedResource;
if (file.isFile()) {
System.out.println(file.getAbsolutePath() + ” is changed”);
}

}
}

public void onDelete(Object deletedResource) {
if (deletedResource instanceof String) {
String deletedFile = (String) deletedResource;
System.out.println(deletedFile + ” is deleted”);
}
}
}

为了使用方便,将该源代码未作任何改动,部署到个人的repository上,可在maven中引用:

<dependency>
<groupId>com.lightspeedleader</groupId>
<artifactId>directorywatcher</artifactId>
<version>1.0</version>
</dependency>

监听器程序启动线程监控目录,如果不再使用,应该予以关闭:

dw.stop();

如果是在web系统中使用,应该通过web应用监听器:

javax.servlet.ServletContextListener

contextInitialized方法启动文件监听器,通过contextDestroyed方法关闭文件监听器。

有关该监听器的用法,见:

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContextListener.html

工程源代码在附件中,大家可以进行下载使用

分享到:
评论

相关推荐

    Java实现时间监听

    Java实现时间监听Java实现时间监听Java实现时间监听Java实现时间监听Java实现时间监听Java实现时间监听

    JAVA监听器响应机制模拟

    最近一直在搞低耦合的代码设计,后来发现JAVA中的监听器效果很不错,就特地研究了一下监听流程,后来经过调试终于成功,供大家分享下: 响应代码: /** * 事件响应运行 * @author wangchen * */ class EventRun {...

    oracle Socket监听数据库推送信息

    oracle触发器+存储过程+java socket 实现数据库监听,一旦数据库改变,返回消息调用java 方法

    Java Swing实现JTable检测单元格数据变更事件的方法示例

    主要介绍了Java Swing实现JTable检测单元格数据变更事件的方法,结合完整实例形式分析了Swing实现JTable检测单元格数据变更事件过程中出现的问题与相关解决方法,需要的朋友可以参考下

    Java监控u盘插入

    Java监控u盘插入, // U盘检测 public class CheckU { // 存放磁盘状态 private static Map, Boolean&gt; map = new LinkedHashMap, Boolean&gt;(); // 定义磁盘 private static final String[] arr = new String[] {...

    Java开发技术大全(500个源代码).

    dir.java 显示目录下的所有文件和目录 encrypt.java 文件加密 FileList.java 自己实现的一个文件名称枚举类 MyDataIO.java 数据输入输出示例 MyFileOutput.java 将键盘读入的文字保存到文件 MyPipedIO.java ...

    java开发gui教程之jframe监听窗体大小变化事件和jframe创建窗体

    主要介绍了java开发gui教程中jframe监听窗体大小变化事件和jframe创建窗体的示例,需要的朋友可以参考下

    基于Java的红绿灯实现

    基于Java实现的图形界面,可以通过鼠标选择按钮,实现红绿灯功能

    Java贪吃蛇游戏实训(源代码+可运行Jar包+实训报告)

    本次项目设计主要是完成《贪吃蛇》游戏的基本操作,需要满足以下几点要求:(1)构建适当的窗口大小,设置键盘监听功能,按下空格键游戏开始,使用方向键来改变蛇的运行轨迹,使蛇可以吃到食物。(2) 使用Random函数来...

    HTML事件改变矩形大小,java开发过程展示.docx

    1. 在JavaScript中,获取该矩形元素并添加事件监听器,实现拖拽改变大小的效果: ``` var rectangle = document.getElementById('myRectangle'); rectangle.addEventListener('mousedown', function(event) { ...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...

    Java程序设计复习题.docx.docx

    JDK的jre目录 下列关于Java语言特点的叙述中,错误的是 A - Java是面向过程的编程语言 B. Java支持分布式计算 C. Java是跨平台的编程语言 D. Java支持多线程 Java的核心包中,提供编程应用的基本类的包是 。 java, ...

    Java聊天室程序源码(毕业设计)

    Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。 Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。 3. 2 系统实现原理 当用户聊天时,将当前用户名...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.1 想要用Java改变这个世界吗? 2 1.1.1 Java有什么优势? 2 1.1.2 Java在哪儿? 3 1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 1.2.3 配置环境变量 6 1.2.4 测试环境是否安装成功 8 1.2.5 ...

    java编写一个颜色调色板程序,界面用户程序

    四个类Converter,HSL,RGB,TestPanels;HSL与RGB中含有各自的属性;Converter类中提供转换方法;RGB2HSL即RGBHSL; HSL2RGB ...给滑动值添加ChangeListener监听,改变颜色以及文本框中的值,观察结果。

    Java图形用户界面

    对于AWT而言,Java 1.1到Java 1.2最大的改变就是Java中所有的库。当Java 1.1版纳入新的事件模型和Java Beans时,平台被设置--现在它可以被拖放到可视化的应用程序构建工具中,创建GUI组件。另外,事件模型的设计和...

    java Socket实现聊天程序

    Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。 Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。 3. 2 系统实现原理 当用户聊天时,将当前用户名...

    java仿电视机屏保动画

    Java Swing动画的简单例子,包含鼠标监听器,是一个类似老式电视机屏保的动画(就是logo在黑屏上来回弹,碰到边框就变颜色并改变方向弹开),点击鼠标左键是暂停,点击右键是改变颜色

    java写的画板

    (8)文字功能:读取文本框中的文本并打印到屏幕鼠标的相应的响应位置,传入输入的文字大小的参数,以此来改变文字的大小; 4.弹泡泡功能的设计 根据Java多线程来实现弹泡泡功能;泡泡的位置颜色随机出现,并且做到...

Global site tag (gtag.js) - Google Analytics