`
threeman
  • 浏览: 10632 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

JAVA轻量级文件监控

 
阅读更多

介绍

本文主要介绍一种轻量级的文件监控方式,对文件的Create & Change & Delete,都有一个对应的Event方法来进行处理。对于核心的File Monitor Class,我们继承一个监听适配器类FileAlterationListenerAdaptor,这样会更方便,就不用再去重写每个Event方法。


File Generator Class

package shuai.study.file.generator;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Date;

import org.apache.log4j.Logger;

import shuai.study.file.tooler.CommonTooler;

/**
 * @author shengshu
 * 
 */
public class FileGenerator implements Runnable {
	private static final Logger LOG = Logger.getLogger(FileGenerator.class);

	private String directory = null;

	private static Date date = new Date();

	public FileGenerator(String directory) {
		this.directory = directory;
	}

	private void generator(String directory) {
		for (int i = 0; i < 10; i++) {
			String fileName = CommonTooler.getDateTimeFormat(date) + "-" + Thread.currentThread().getId() + i + ".pm";

			LOG.info("[Path]: " + directory + "/" + fileName);

			try {
				// Create file (path: directory/fileName)
				Files.createFile(Paths.get(directory, fileName));
			} catch (IOException ioe) {
				ioe.printStackTrace();
			}
		}
	}

	@Override
	public void run() {
		this.generator(directory);
	}
}

File Monitor Class

package shuai.study.file.monitor;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.log4j.Logger;

import shuai.study.file.tooler.CommonTooler;

/**
 * @author shengshu
 * 
 */
public class FileMonitor extends FileAlterationListenerAdaptor {
	private static final Logger LOG = Logger.getLogger(FileMonitor.class);

	private static FileMonitor fileMonitor;

	private static int pageNumber = 0;

	private FileMonitor() {

	}

	// Get singleton object instance
	public static FileMonitor getFileMonitor() {
		if (fileMonitor == null) {
			synchronized (FileMonitor.class) {
				if (fileMonitor == null) {
					fileMonitor = new FileMonitor();
				}
			}
		}

		return fileMonitor;
	}

	// Create file event
	@Override
	public void onFileCreate(File file) {
		LOG.info("[Create]: " + file.getAbsolutePath());

		String fileAbsolutePath = file.getAbsolutePath();
		String fileAbsoluteParentPath = file.getParent();
		String fileBaseName = FilenameUtils.getBaseName(fileAbsolutePath);

		File destFile = new File(fileAbsoluteParentPath + File.separator + fileBaseName + "-" + CommonTooler.pagingFormat(pageNumber) + ".xml");

		try {
			FileUtils.moveFile(file, destFile);
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}

		pageNumber++;
	}

	// Change file event
	@Override
	public void onFileChange(File file) {
		LOG.info("[Change]: " + file.getAbsolutePath());
	}

	// Delete file event
	@Override
	public void onFileDelete(File file) {
		LOG.info("[Delete]: " + file.getAbsolutePath());
	}

	public void monitor(String directory, int interval) {
		// Observer file whose suffix is pm 
		FileAlterationObserver fileAlterationObserver = new FileAlterationObserver(directory, FileFilterUtils.and(FileFilterUtils.fileFileFilter(),
				FileFilterUtils.suffixFileFilter(".pm")), null);

		// Add listener for event (file create & change & delete)
		fileAlterationObserver.addListener(this);

		// Monitor per interval
		FileAlterationMonitor fileAlterationMonitor = new FileAlterationMonitor(interval, fileAlterationObserver);

		try {
			// Start to monitor
			fileAlterationMonitor.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

File Tester Class

package shuai.study.file.tester;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import org.apache.log4j.Logger;

import shuai.study.file.generator.FileGenerator;
import shuai.study.file.monitor.FileMonitor;

/**
 * @author shengshu
 * 
 */
public class FileTester {
	private static final Logger LOG = Logger.getLogger(FileTester.class);

	private static String directory = "/home/omc/tmp";

	public static void main(String[] args) {
		// Create directory if it does not exist 
		try {
			Files.createDirectory(Paths.get(directory));
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}

		LOG.info("File Monitor...");
		// Start to monitor file event per 500 milliseconds
		FileMonitor.getFileMonitor().monitor(directory, 500);

		LOG.info("File Generater...");
		// New runnable instance
		FileGenerator fileGeneratorRunnable = new FileGenerator(directory);

		// Start to multi-thread for generating file
		for (int i = 0; i < 10; i++) {
			Thread fileGeneratorThread = new Thread(fileGeneratorRunnable);
			fileGeneratorThread.start();
		}
	}

}


Common Tool Class

package shuai.study.file.tooler;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author shengshu
 * 
 */
public class CommonTooler {

	// Date time format
	public static String getDateTimeFormat(Date date) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd-HHmm");
		String dateTime = simpleDateFormat.format(date);

		return dateTime;
	}

	// Page format
	public static String pagingFormat(int pageNumber) {
		String pageNumberStr = "P00";

		if (pageNumber < 0) {
			throw new NumberFormatException("The page number should not be negative");
		}

		if (pageNumber < 10) {
			pageNumberStr = String.format("P0%d", pageNumber);
		} else {
			pageNumberStr = String.format("P%d", pageNumber);
		}

		return pageNumberStr;
	}

}

分享到:
评论

相关推荐

    轻量级JAVA实时业务风控系统框架.zip

    轻量级,可扩展,实时的Java业务风控系统 基于Spring boot构建,配置文件能少则少 使用drools规则引擎管理风控规则,原则上可以动态配置规则 使用redis、mongodb做风控计算和事件储存,历史事件支持水平扩展 原理 ...

    java开发oa办公系统源码-active4j-boot:Active4j-Boot是基于SpingBoot2.0轻量级的java快速开发框架

    Active4j-Boot是基于SpingBoot2.0轻量级的java快速开发框架。以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache Shiro为权限授权层, Redis为分布式缓存,Quartz为...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java开源包11

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包6

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包9

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包4

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包101

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包5

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包8

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包10

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包3

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包1

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java版oa源码下载-active4j:Active4j-boot是基于SpingBoot2.0轻量级的java快速开发框架。以Spring

    Active4j-boot是基于SpingBoot2.0轻量级的java快速开发框架。以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache Shiro为权限授权层, Redis为分布式缓存,Quartz为...

    java开源包2

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包7

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    Java资源包01

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    前 言 致 谢 第一部分 走近Java 第...358 13.3.4 轻量级锁 / 358 13.3.5 偏向锁 / 361 13.4 本章小结 / 362 附录A Java虚拟机家族 / 363 附录B 虚拟机字节码指令表 / 366 附录C HotSpot虚拟机主要参数表 / 372

Global site tag (gtag.js) - Google Analytics