`
dyccsxg
  • 浏览: 205342 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类

Java实现的文件监控管理

    博客分类:
  • Java
阅读更多

实现功能:实时监控指定目录下文件的增加 / 更新 / 删除 情况.

// monitor.file.FileMonitor.java
package monitor.file;

/**
 *@date 2010-3-18 上午10:12:14
 *@author dycc
 *@file monitor.file.FileMonitor.java
 */
public class FileMonitor {
	public static void main(String[] args) {
	    FileSchedulerTask task = new FileSchedulerTask("D:\\Temp");
	    FileScheduler monitor = new FileScheduler();
	    monitor.schedule(task, new TimeStep());
    }
}

// monitor.file.FileScheduler.java
package monitor.file;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 *@date 2010-3-18 上午10:31:26
 *@author dycc
 *@file monitor.file.FileScheduler.java
 */
public class FileScheduler {
	// 定时器
	private final Timer timer;
	
	public FileScheduler(){
		timer = new Timer();
	}
	public FileScheduler(boolean isDaemon){
		// 是否为守护线程
		timer = new Timer(isDaemon);
	}
	/**
	 * 为定时器分配可执行任务
	 * @param task
	 * @param step
	 */
	public void schedule(Runnable task,TimeStep step){
		Date time = step.next();
		SchedulerTimerTask timeTask = new SchedulerTimerTask(task,step);
		// 安排在指定的时间 time 执行指定的任务 timetask
		timer.schedule(timeTask, time);
		// 此处不使用
		// public void schedule(TimerTask task, Date firstTime, long period)
		// 执行定时任务,而是使用 reSchedule 来重复执行任务,是因为首次执行时可能需要做一些额外的初始化,
		// 这样方便以后扩展.
	}
	/**
	 * 重新执行任务
	 * @param task
	 * @param step
	 */
	private void reSchedule(Runnable task,TimeStep step){
		Date time = step.next();
		SchedulerTimerTask timeTask = new SchedulerTimerTask(task,step);
		// 安排在指定的时间 time 执行指定的任务 timetask
		timer.schedule(timeTask, time);
	}
	/**
	 * 停止当前定时器
	 */
	public void cancle(){
		timer.cancel();
	}
	/**
	 * 定时任务
	 * @author dycc
	 *
	 */
	private class SchedulerTimerTask extends TimerTask{
		private Runnable task;
		private TimeStep step;
		
		public SchedulerTimerTask(Runnable task,TimeStep step){
			this.task = task;
			this.step = step;
		}
		@Override
		public void run() {
			// 执行指定任务
		    task.run();
		    // 继续重复执行任务
		    reSchedule(task, step);
		}
	}
}

// monitor.file.FileSchedulerTask.java
package monitor.file;

import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 *@date 2010-3-18 上午10:39:29
 *@author dycc
 *@file monitor.file.FileSchedulerTask.java
 */
public class FileSchedulerTask implements Runnable{
	
	private boolean firstRun = true;
	
	private String directory = "";
	// 初始文件信息
	private Map<String,Long> currentFiles = new HashMap<String,Long>();
	// 当前文件信息
	private Set<String> newFiles = new HashSet<String>();
	
	/**
	 * 构造函数
	 */
	public FileSchedulerTask(){
		
	}
	public FileSchedulerTask(String directory){
		this.directory = directory;
	}
	/**
	 * 在 run() 中执行具体任务
	 */
	public void run() {
	    File file = new File(directory);
	    if(firstRun){
	    	firstRun = false;
	    	// 初次运行
	    	loadFileInfo(file);
	    	System.out.println("----- init success -----");
	    } else{
	    	// 检查文件更新状态[add,update]
	    	checkFileUpdate(file);
	    	// 检查被移除的文件[remove]
	    	checkRemovedFiles();
	    	// 清空临时文件集合
	    	newFiles.clear();
	    }
	}
	/**
	 * 初始化文件信息
	 * @param file
	 */
	private void loadFileInfo(File file){
		if(file.isFile()){
			currentFiles.put(file.getAbsolutePath(), file.lastModified());
			return;
		}
		File[] files = file.listFiles();
		for(int i=0;i<files.length;i++){
			loadFileInfo(files[i]);
		}
	}
	/**
	 * 检查文件更新状态
	 * @param file
	 */
	private void checkFileUpdate(File file){
		if(file.isFile()){
			// 将当前文件加入到 newFiles 集合中
			newFiles.add(file.getAbsolutePath());
			// 
			Long lastModified = currentFiles.get(file.getAbsolutePath());
			if(lastModified == null){
				// 新加入文件
				currentFiles.put(file.getAbsolutePath(), file.lastModified());
				System.out.println("添加文件:" + file.getAbsolutePath());
				return;
			}
			if(lastModified.doubleValue() != file.lastModified()){
				// 更新文件
				currentFiles.put(file.getAbsolutePath(), file.lastModified());
				System.out.println("更新文件:" + file.getAbsolutePath());
				return;
			}
			return;
		} else if(file.isDirectory()){
			File[] files = file.listFiles();
			if(files == null || files.length == 0){
				// 没有子文件或子目录时返回
				return;
			}
			for(int i=0;i<files.length;i++){
				checkFileUpdate(files[i]);
			}
		}
	}
	/**
	 * 检查被移除的文件
	 */
	private void checkRemovedFiles(){
		// 增加或更新时,newFiles.size() == currentFiles.size()
		// 删除时,    newFiles.size()  < currentFiles.size()
		// 不可能出现      newFiles.size()  > currentFiles.size()
		if(newFiles.size() == currentFiles.size()){
			// 增加或更新时没有被移除的文件,直接返回
			return;
		}
		Iterator<String> it = currentFiles.keySet().iterator();
		while(it.hasNext()){
			String filename = it.next();
			if(!newFiles.contains(filename)){
				// 此处不能使用 currentFiles.remove(filename);从 map 中移除元素,
				// 否则会引发同步问题.
				// 正确的做法是使用 it.remove();来安全地移除元素.
				it.remove();
				System.out.println("删除文件:" + filename);
			}
		}
	}
	/**
	 * 起始目录
	 * @return
	 */
	public String getDirectory() {
	    return directory;
    }
	public void setDirectory(String directory) {
	    this.directory = directory;
    }
}

// monitor.file.TimeStep.java
package monitor.file;

import java.util.Calendar;
import java.util.Date;

/**
 *@date 2010-3-18 上午10:12:14
 *@author dycc
 *@file monitor.file.TimeStep.java
 */
public class TimeStep {
	private Calendar calendar = Calendar.getInstance();
	// calendar field
	private int field = Calendar.SECOND;
	// the amount of the date or time
	private int amount = 10;
	
	/**
	 * field
	 * @return
	 */
	public int getField() {
	    return field;
    }
	public void setField(int field) {
	    this.field = field;
    }
	/**
	 * amount
	 * @return
	 */
	public int getAmount() {
	    return amount;
    }
	public void setAmount(int amount) {
	    this.amount = amount;
    }
	/**
	 * 获取时间
	 * @exception IllegalArgumentException if field is unknown
	 * @return
	 */
	public Date next(){
		calendar.add(field, amount);
		return calendar.getTime();
	}
}

 

 

分享到:
评论
6 楼 LaoV 2015-03-11  
推荐一个文件监控的插件 JNotify

http://www.weixuehao.com/archives/350

这个插件还算不错!
适合在windows下,和linux下使用。
5 楼 zcx000000 2012-10-10  
linux下的能用吗?文件目录是怎么写?
4 楼 damoqiongqiu 2011-07-05  
很帅,标记一下,马上会用到
3 楼 dyccsxg 2010-11-16  
测试了一下 commons-io 中的文件监控
下载:http://commons.apache.org/io/download_io.cgi
package org.demo.file;

import java.util.concurrent.TimeUnit;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

/**
 * 文件监控测试
 * @author  
 * @date    2010-11-16
 * @file    org.demo.file.FileMonitor.java
 */
public class FileMonitorTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		// 监控目录
		String rootDir = "d:\\Temp";
		// 轮询间隔 5 秒
		long interval = TimeUnit.SECONDS.toMillis(5);
		// 
		FileAlterationObserver observer = new FileAlterationObserver(
				                              rootDir, 
				                              FileFilterUtils.and(
				                               FileFilterUtils.fileFileFilter(),
				                               FileFilterUtils.suffixFileFilter(".java")), 
				                              null);
		observer.addListener(new MyFileListener());
		FileAlterationMonitor monitor = new FileAlterationMonitor(interval,observer);
		// 开始监控
		monitor.start();
	}
}

package org.demo.file;

import java.io.File;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;

/**
 * 自定义文件监听器
 * @author  
 * @date    2010-11-16
 * @file    org.demo.file.MyFileListener.java
 */
public class MyFileListener extends FileAlterationListenerAdaptor{
	@Override
	public void onFileCreate(File file) {
		System.out.println("[新建]:" + file.getAbsolutePath());
	}
	@Override
	public void onFileChange(File file) {
		System.out.println("[修改]:" + file.getAbsolutePath());
	}
	@Override
	public void onFileDelete(File file) {
		System.out.println("[删除]:" + file.getAbsolutePath());
	}
}
2 楼 plghqr 2010-11-12  
org.apache.commons.io.monitor.FilesystemObserver in commons-io.jar
1 楼 xbgd 2010-09-03  
写的很帅

可是我发现,ccopy一个很大的文件到目标文件去时,首先提示增加文件,然后我copy完毕后提示更新文件.


所以在判断增加文件 或者 更新文件时,都需要检查熬文件是否被占用中.....



代码我拿去重用下 \(^o^)/~

相关推荐

    java实现简单远程监控

    在IT行业中,远程监控是一项重要的技术,...总的来说,Java实现远程监控是一个涉及JMX、RMI以及网络编程的综合过程。通过合理设计和实现,我们可以构建出一个强大且灵活的监控解决方案,有效管理和维护我们的Java应用。

    基于JAVA网络远程监控系统软件的实现(源码)

    这可以通过JMX(Java Management Extensions)来实现,JMX提供了一种标准的方式来管理和监控Java应用程序。 2. **数据处理模块**:接收并解析采集到的数据,根据预设的阈值进行异常检测,如果发现潜在问题,会触发...

    文件监控文件监控文件监控文件监控

    为了实现文件监控,开发者可能需要以下步骤: 1. 创建一个`WatchService`实例,通常通过调用`FileSystems.getDefault().newWatchService()`。 2. 使用`WatchKey`注册要监控的目录,注册事件包括ENTRY_CREATE、ENTRY_...

    java实现文件监控.docx

    ### Java 实现文件监控 #### 一、引言 在Java开发中,有时我们需要对文件系统中的文件或目录进行实时监控,例如为了响应文件的创建、删除、修改等事件而采取相应的动作。Java本身并不直接支持这样的功能,但是可以...

    java实现windows文件系统操作监控

    以上就是实现"java实现windows文件系统操作监控"所需的主要知识点,包括系统钩子、JNI、文件系统API、事件处理、文件操作、加密算法、多线程和异常处理等。在实际开发中,需要根据具体需求进行适当的调整和优化,以...

    毕业设计 基于JAVA CS远程监控系统软件的实现(源代码+论文)

    实现被监控端硬盘文件的上传、下载;实现对鼠标、键盘的模拟;实现在远程机器上执行任意DOS命令;远程关机、远程重启计算机,方便了用户监视和操作被监控端机器。本系统从系统需求分析、概要设计、详细设计到具体的...

    基于java的数据监控与管理平台技术实现.pdf

    本文介绍了一个基于Java语言开发的数据监控与管理平台,该平台通过全国CIMISS气象数据统一服务接口获取数据,并利用Web技术为用户提供了一个气象数据监控与工作管理平台。在这个平台上,实现了对气象监测业务中多种...

    Sigar Java实现系统监控

    本篇文章将深入探讨如何使用Sigar在Java中进行系统监控,并介绍相关的代码实现和包含的库文件。 首先,要使用Sigar进行Java系统监控,你需要下载Sigar的Java绑定包,这个包通常包含了所有必要的库文件,支持多种...

    Java 服务器信息监控

    本文将详细探讨使用Java实现的服务器监控程序,以及如何利用它来监控CPU、内存、网络连接和服务状态。 Java作为一种跨平台的语言,为开发服务器监控工具提供了便利。在"Java 服务器信息监控"项目中,开发者可以编写...

    基于java的文件监控程序设计与实现.pdf

    本文介绍的基于Java的文件监控程序,它通过桌面式程序的方式实现,主要监控Windows系统下的文件目录变化,并提供对文件信息的采集和修改操作。 在讨论其设计和实现之前,有必要了解几个核心概念:文件处理、Java...

    基于JAVA CS远程监控系统软件的实现(源代码+文档).zip

    在这个基于Java实现的系统中,我们通常会利用Java的强大特性和丰富的类库来构建跨平台、高效稳定的监控解决方案。下面将详细探讨Java CS远程监控系统的实现及其相关知识点。 1. **Java编程语言**:Java是一种面向...

    java流量监控软件

    `NetMonitor`可能是软件的主程序文件或者相关的组件,它与流量监控的核心功能相关联,可能包含了数据解析、流量统计、图形显示等功能的实现。 总的来说,这个Java流量监控软件利用了Java的跨平台特性和网络管理的...

    java写的ftp下载上传定时监控

    Java作为多平台支持的编程语言,提供了丰富的库和工具来实现FTP功能,包括下载、上传文件以及定时监控等操作。本篇文章将深入探讨如何使用Java进行FTP文件传输,并涉及自动解压和压缩的功能。 首先,让我们关注Java...

    基于JAVACS远程监控系统软件的实现.pdf

    这可能表明在JAVACS远程监控系统中,有通过浏览器插件方式实现远程监控的组件,允许用户通过Web界面进行系统的远程访问和管理。 综合以上内容,可以推断出JAVACS远程监控系统软件的实现涉及到多个方面的技术细节,...

    java写的实现远程监控的程序源码

    深入研究这些源码,开发者可以学习到如何使用Java实现网络通信、多线程编程、数据序列化、图形用户界面设计以及安全性控制等多方面的知识。同时,了解如何将程序集成到现有应用(如QQ)中,也能提升开发者对于API...

    Java实现的图书信息管理系统

    《Java实现的图书信息管理系统》 图书信息管理系统是一款基于JAVA技术构建的应用软件,主要用于图书馆的日常管理工作,包括图书的录入、查询、借阅、归还、统计等功能。它以其高效、稳定、易用的特点,成为了现代...

    Java视频监控系统源码

    【Java视频监控系统源码】是一个基于Java技术开发的实时监控解决方案,主要用于安防领域,能够实现即时监控功能。系统采用B/S(Browser/Server)架构,即浏览器/服务器模式,这意味着用户可以通过网页来访问和控制...

    java开发的一个windows的远程监控软件

    标题中的“java开发的一...总的来说,这个Java开发的Windows远程监控软件结合了Java编程语言的跨平台优势,实现了对Windows系统的远程监控功能,涵盖了多种监控及管理操作,并且在开发过程中可能运用了多种技术和工具。

    Java_cs监控系统软件的实现

    Java_CS监控系统软件的实现是基于Java技术和C/S(客户端/服务器)模式的远程监控解决方案。随着网络技术的快速发展,远程监控系统已经成为管理和控制远程设备的重要工具,它允许用户无需亲自到场,只需通过电脑即可...

    java虚拟机性能监控

    Java虚拟机不仅为Java代码提供了一个运行环境,还提供了自动内存管理等高级特性,使得开发者能够更加专注于业务逻辑而非底层实现细节。然而,这同时也增加了系统性能监控的复杂度。本文将基于给定文件中的信息,深入...

Global site tag (gtag.js) - Google Analytics