目前为止,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中的监听器效果很不错,就特地研究了一下监听流程,后来经过调试终于成功,供大家分享下: 响应代码: /** * 事件响应运行 * @author wangchen * */ class EventRun {...
在这个"java监听者模式三个实例"中,我们将深入探讨如何使用监听者模式来实现事件驱动的编程。 1. **监听者模式的基本概念** - **观察者(Observer)**:即监听者,它定义了接口用于接收被观察者的通知。 - **被...
Java实现实时监控目录下文件变化的方法 Java实现实时监控目录下文件变化的方法是指通过Java语言来实现实时监控目录下文件的变化情况,包括文件的创建、删除、修改等操作。这种方法可以应用于各种场景,例如文件系统...
Java 6引入了一个新的特性——Java Database Change Notification,允许应用程序订阅数据库的改变。当数据库中的指定表发生变化时,JDBC驱动会通知订阅者。这是一个相对低级别的API,需要对数据库驱动有深入理解...
3. 设置父进程为init进程:在Unix系统中,这通常是通过改变进程组和会话ID来实现的,但在Java中,这个操作较复杂,可能需要通过操作系统调用来完成。 创建多个进程和JVM可以通过`java.lang.ProcessBuilder`类实现。...
在Android平台上,开发Java应用程序时,我们经常需要处理与文件系统相关的任务,其中之一就是实现文件监听器。这个功能允许我们实时监控一个特定的文件夹,一旦该文件夹中有新的文件出现,程序可以立即做出响应,...
Java中的监听机制与观察者设计模式是编程中重要的概念,它们在软件开发中扮演着关键的角色,尤其是在构建可扩展和可维护的系统时。这里,我们将深入探讨这两个主题,并通过实例来阐述它们的工作原理和应用。 首先,...
在Java编程语言中,"监听方法"是一种关键的机制,主要用于事件驱动编程。这个概念主要应用于用户界面(UI)开发,如Swing或JavaFX,但也适用于其他领域,如网络通信或多线程同步。本篇文章将深入探讨Java中的监听...
描述部分重复了标题的内容,强调了Java监听器的功能。它不仅可以用于监听客户端的请求,还可以监听服务端内部的状态变化,如会话管理。这种机制对于实时系统尤其有用,比如在线用户统计、聊天室等应用。 ### 监听器...
#### 二、Java监听器 监听器是实现特定接口的类,用于接收并响应来自事件源的事件。监听器通常需要实现特定接口中定义的方法,这些方法会在相应的事件发生时被调用。例如,对于按钮点击事件,监听器需要实现`...
总之,Java监听器是Java Servlet API中的重要组成部分,它们允许开发者在特定的事件上下文中执行代码,从而实现自动化、无侵入式的功能扩展。通过理解并熟练运用监听器,可以更高效地管理和控制Web应用程序的运行...
### Java监听器详解 在Java编程语言中,监听器(Listener)是一种常用的设计模式,用于实现事件处理机制。本文将围绕“Java监听器”的概念、原理及其应用进行深入探讨。 #### 一、Java监听器的基本概念 监听器是...
当USB设备发生改变时,这些函数会被调用,并将相关信息传递给Java层。 接下来,我们需要在Java中使用JNI来调用C编写的DLL。首先,你需要在Java类中声明native方法,这些方法将映射到DLL中的函数。例如: ```java ...
在Java编程环境中,实现“java监听U盘”主要涉及到文件系统监控、事件处理以及I/O操作等技术。本文将深入探讨如何使用Java来监听U盘的插入和移除,并进行内容搬移的操作。 首先,Java并没有内置直接监听USB设备插入...
在本篇文章中,我们将深入探讨Java中滑块组件的变更监听器以及如何使用它们。 首先,滑块组件(JSlider)的核心功能在于它的事件处理。当用户改变滑块的位置时,系统会产生一个ChangeEvent事件。为了监听这种变化,...
在Java编程中,图片绘制和鼠标事件监听是两个重要的概念,尤其对于开发用户界面和交互式应用程序至关重要。本文将深入探讨这两个主题,并结合一个名为"Plane"的示例,帮助初学者理解如何在Java中实现这些功能。 ...
总结来说,实现一个Java系统目录树控件涉及到创建和管理树形数据结构,监听用户交互,以及可能的自定义渲染。无论是Swing的JTree还是JavaFX的TreeView,它们都提供了方便的API来实现这一功能。通过理解这些基础概念...
Java Swing 实现 JTable 检测单元格数据变更事件的方法示例 Java Swing 中的 JTable 是一个功能强大且灵活的表格组件,广泛应用于各种桌面应用程序中。然而,在实际开发中,我们经常需要检测单元格数据的变更事件...