`
jy02149522
  • 浏览: 47675 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

文件监听的例子 JAVA版

    博客分类:
  • JAVA
阅读更多

 主要实现的机制大体网上都有说明,就是一个线呈一直跑着,监听着文件的最后修改时间,然后再进行一些处理。

 比如自动编译文件,自动重载文件啊,应该都是通过这个机制去实现的。下面贴点代码,附件也给出eclipse代码工程.

代理是参考别人的改的,还挺简单的,我就是整理了一下,谁需要就直接拿去用吧。

 

1 FileListener.java  监听接口

 

import java.io.File;

public interface FileListener
{
	void fileChanged (File file);
} 

 2 FileListenerImpl.java 具体的监听实现

import java.io.File;


public class FileListenerImpl implements FileListener {

	public void fileChanged(File file) {
		System.out.println(" File [ " + file.getName() + " ] changed At: "
				+ new java.util.Date());
	}
}

 3 FileMonitor.java 监听任务的工作类

import java.util.*;
import java.io.File;
import java.lang.ref.WeakReference;

public class FileMonitor {

	private Timer timer;

	private HashMap files_; 

	private Collection listeners; // of WeakReference(FileListener)

	public FileMonitor(long pollingInterval) {
		files_ = new HashMap();
		listeners = new ArrayList();
		timer = new Timer(true);
		timer.schedule(new FileMonitorNotifier(), 0, pollingInterval);
	}

	public void stop() {
		timer.cancel();
	}

	public void addFile(File file) {
		if (!files_.containsKey(file)) {
			long modifiedTime = file.exists() ? file.lastModified() : -1;
			files_.put(file, new Long(modifiedTime));
		}
	}

	public void removeFile(File file) {
		files_.remove(file);
	}

	public void addListener(FileListener fileListener) {
		for (Iterator i = listeners.iterator(); i.hasNext();) {
			WeakReference reference = (WeakReference) i.next();
			FileListener listener = (FileListener) reference.get();
			if (listener == fileListener)
				return;
		}
		listeners.add(new WeakReference(fileListener));
	}

	public void removeListener(FileListener fileListener) {
		for (Iterator i = listeners.iterator(); i.hasNext();) {
			WeakReference reference = (WeakReference) i.next();
			FileListener listener = (FileListener) reference.get();
			if (listener == fileListener) {
				i.remove();
				break;
			}
		}
	}

	private class FileMonitorNotifier extends TimerTask {
		public void run() {
			Collection files = new ArrayList(files_.keySet());

			for (Iterator i = files.iterator(); i.hasNext();) {
				File file = (File) i.next();
				long lastModifiedTime = ((Long) files_.get(file)).longValue();
				long newModifiedTime = file.exists() ? file.lastModified() : -1;

				if (newModifiedTime != lastModifiedTime) {

					files_.put(file, new Long(newModifiedTime));

					for (Iterator j = listeners.iterator(); j.hasNext();) {
						WeakReference reference = (WeakReference) j.next();
						FileListener listener = (FileListener) reference.get();

						// Remove from list if the back-end object has been GC'd
						if (listener == null)
							j.remove();
						else
							listener.fileChanged(file);
					}
				}
			}
		}
	}


}

对上段代码有两个地方不太理解 有高手请帮我解答一下

第一点:为什么要使用WeakReference 呢?这个是干什么用的,我查了下是若引用,但还是不明白,在这里为什么要用这个呢。

 第二点:private HashMap files_; 对于files_的声明,为什么我把files_的下划线用eclipse重构功能去掉(也就是改  名)后,底下就会报错呢。

4 Test.java 测试类

import java.io.File;


public class Test {
	public static void main(String args[]) {

		FileMonitor monitor = new FileMonitor(1000);

		monitor.addFile(new File(
				"C:\\wlrun.log"));
		monitor.addListener(new FileListenerImpl());

		while (!false)
		;
	}
}

 其中FileMonitor monitor = new FileMonitor(1000)中的参数1000 是间隔多长时间进行检查一次,大家在使用的时候

通常是做一个专门处理该任务的线程,而不是直接在main里起一个主线程。

分享到:
评论
3 楼 hcwj2009 2011-09-15  
也就是重名了....
2 楼 hcwj2009 2011-09-15  
关于第二个问题,在内部类
private class FileMonitorNotifier extends TimerTask 
中,有这么一声明“
Collection files = new ArrayList(files_.keySet());   
”,楼主一定没有注意,恰巧在这里有用到了
 long lastModifiedTime = ((Long)[color=red] files_.[/color]get(file)).longValue();   
,当然会报错了
1 楼 310628570 2009-06-15  
不错!!  

相关推荐

    java 监听本地文件自动上传服务器

    本篇文章将详细探讨如何使用Java实现本地文件监听,并自动将其上传至服务器,以实现文件同步功能。 首先,让我们从“JAVA 监听文件夹变化”这个知识点开始。Java提供了一种称为`WatchService`的机制,它允许程序...

    java一个监听器的例子

    这个例子将探讨如何在Java中使用监听器,特别是事件监听器,它们是Java Swing和Java AWT库中用于图形用户界面(GUI)交互的核心组成部分。 首先,我们需要了解Java中的事件模型。Java事件模型基于发布/订阅原则,...

    java文件监控例子--jnotify

    Java文件监控是一个重要的系统功能,它允许程序监听文件或目录的改变,如创建、修改、删除等事件。在Java中,实现文件监控的一种流行库是`jnotify`。`jnotify`是一个轻量级的库,它提供了一个简单的方式来监控文件...

    java文件监控例子

    标题中的"java文件监控例子"就是关于如何使用JNotify来实现文件监控的示例。 JNotify库的核心在于提供了一个简单的API,让开发者能够轻松注册对特定文件或目录的监听,并在这些文件或目录发生变化时接收到回调通知...

    有用的例子啊JAVA文件选择器

    这个“有用的例子啊JAVA文件选择器”提供的示例代码可以帮助我们更好地理解如何在Java应用程序中集成这样的功能。下面将详细探讨Java中的文件选择器及其相关知识点。 1. **JFileChooser类**: `JFileChooser` 是Java...

    session监听小例子

    在"session监听小例子"中,开发者可能创建了一个实现了以上接口的类,然后在Web应用的`web.xml`配置文件中进行注册,这样每当Session发生生命周期事件时,对应的监听方法就会被调用。 例如,我们可能会在`...

    contentProvider监听的例子

    总结来说,ContentProvider监听的例子主要涉及了如何创建ContentProvider、在AndroidManifest.xml中声明Provider、使用ContentObserver监听数据变化以及如何处理这些变化。这在多应用间共享数据或实现数据监听的场景...

    JAVA SESSION监听器

    Java Session监听器是Java Servlet规范中提供的一种机制,用于对HttpSession对象的生命周期事件进行监听和处理。在Web应用程序中,Session是用来跟踪用户状态的重要工具,特别是在无状态的HTTP协议上。当用户登录后...

    Java Swing 文件选择器

    总结来说,这个"Java Swing 文件选择器"的例子展示了如何利用`JFileChooser`组件在Java Swing应用中实现用户友好的文件选择功能。通过理解`JFileChooser`的工作原理和提供的各种配置选项,开发者可以轻松地集成文件...

    java监测一个目录是否有文件的增删改,附例子和jar

    在这个例子中,我们注册了`ENTRY_CREATE`(文件创建)、`ENTRY_DELETE`(文件删除)和`ENTRY_MODIFY`(文件修改)三种事件。每当发生这些事件时,程序会打印出对应的操作和受影响的文件名。注意,`take()`方法会阻塞...

    java100个经典例子

    "java100个经典例子"提供了丰富的示例代码,帮助初学者逐步进阶。以下是对几个例子的详细解释: 1. **第一个Java程序**: 这是每个Java初学者都会遇到的第一个Hello World程序,展示了Java程序的基本结构。`public...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Android 滑动手势监听例子源码.zip

    这个"Android 滑动手势监听例子源码.zip"文件提供了一个简单的实例,帮助开发者理解和实现滑动手势监听功能。下面我们将深入探讨Android中滑动手势的原理、实现方式以及如何在实际应用中运用这些知识。 首先,...

    Service中的文件监听

    在这个例子中,我们创建了一个名为`FileObserverService`的Service,它在创建时启动文件监听,并在销毁时停止。`onEvent`方法会在每次发生监控事件时被调用,根据`event`参数判断具体事件类型并记录到日志。 需要...

    java中监听机制,以及观察者设计模式

    Java中的监听机制与观察者设计模式是编程中重要的概念,它们在软件开发中扮演着关键的角色,尤其是在...通过分析`ListenerPractice`这个压缩包中的文件,我们可以进一步加深对这两个概念的理解,实践出更生动的例子。

    多文件上传例子及说明

    前端部分,开发者需要监听文件选择事件,获取选中的文件对象,然后通过FormData对象将它们封装成适合发送的数据格式。在用户提交上传请求时,使用XMLHttpRequest或Fetch API发送POST请求,将FormData内容作为请求体...

    jquery文件上传例子(两种方式)

    标题 "jquery文件上传例子(两种方式)" 涉及到的是使用jQuery库进行文件上传的实践,这在Web开发中是非常常见的需求。jQuery是JavaScript的一个轻量级库,它简化了DOM操作、事件处理和Ajax交互等任务。在这个示例中,...

    java图片绘制和鼠标事件监听

    在Java编程中,图片绘制和鼠标事件监听是两个重要的概念,尤其对于开发用户界面和交互式应用程序至关重要。本文将深入探讨这两个主题,并结合一个名为"Plane"的示例,帮助初学者理解如何在Java中实现这些功能。 ...

    java后台监听代码,复制可用

    个人觉得用定时任务来跑垃圾回收不是很好的例子,从译者接触到的项目来看,比较常见的是用定时任务来进行非实时计算,清除临时数据、文件等。 在本文里,我会给大家介绍3种不同的实现方法,listener-class标签 --WEB...

    java注册系统级热键监听

    在这个例子中,我们使用了一个名为“JIntelliType”的库,它是一个Java接口,用于与Microsoft的IntelliType Pro键盘驱动进行交互,从而实现全局热键监听。你可以从`jintellitype-1.3.8-dist.zip`文件中获取这个库,...

Global site tag (gtag.js) - Google Analytics