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;
	}

}
时间: 2024-10-12 02:26:01

JAVA轻量级文件监控的相关文章

Java技巧:java实现文件监控技巧分享

java本身不能直接监听系统的文件操作事件,不过可以先编写C/C++调用操作系统的API监听文件,再通过jni调用的方式实现.限于本人的C/C++水平有限,没有用C/C++实现该接口,而且已有开源组件JNotify实现了这个功能,本文例子使用JNotify. public class MainFrame extends JFrame ...{ private JPanel contentPane; private JTextField textField; private JTextArea t

java实现文件监控

今天看到mybatis配置(xml)动态更新,就想到他们如何实现的对文件修改感知,搜了一下. 有两个思路: 1.创建线程,定时扫描,对比上次和本次的扫描结果.类似实现是:Apache   common-io的  monitor 2.使用操作系统提供,jdk对其封装的类 WatchService 好了不多说,上代码: 1.common-io 示例 : jar包maven地址: <dependency> <groupId>commons-io</groupId> <a

基于SSM框架下的JAVA文件监控管理系统

每天记录学习,每天会有好心情.*^_^* 今日思考,完成一个文件监控管理系统项目,需要实现哪些功能?此类项目常见描述如下:随着信息技术突飞猛进,网络传输已经成为信息传递的主要方式,信息极端主义的手段越来越高深莫测,重要信息的监控显得十分必要.针对信息安全隐患问题,本章设计了文件监控系统,来实现对传输的重要文件进行实时监控,达到安全传输文件以防非法窃取的目的.SSM(MYECLIPSE)框架及其适合本类项目,使用MVC的思想可以极大程度减少重复工作量.和SSM(MYECLIPSE)框架最配的开发工

Android文件监控FileObserver介绍

在前面的Linux文件系统Inotify机制中介绍了Linux对文件变更监控过程.Android系统在此基础上封装了一个FileObserver类来方便使用Inotify机制.FileObserver是一个抽象类,需要定义子类实现该类的onEvent抽象方法,当被监控的文件或者目录发生变更事件时,将回调FileObserver的onEvent()函数来处理文件或目录的变更事件. 事件监控过程 在FileObserver类中定义了一个静态内部类ObserverThread,该线程类才是真正实现文件

基于 JVMTI 实现 Java 线程的监控(转)

随着多核 CPU 的日益普及,越来越多的 Java 应用程序使用多线程并行计算来充分发挥整个系统的性能.多线程的使用也给应用程序开发人员带来了巨大的挑战,不正确地使用多线程可能造成线程死锁或资源竞争,导致系统瘫痪.因此,需要一种运行时线程监控工具来帮助开发人员诊断和跟踪 Java 线程状态的切换.JDK 1.5 及其后续版本提供了监控虚拟机运行状态的接口 JVMTI.本文深入分析了 JVM 中的 Java 线程模型,设计了用于监控线程状态切换的模型,并基于 JVMTI 实现了对 Java 线程切

干货 | 云智慧透视宝Java代码性能监控实现原理

这篇图文并茂,高端大气上档次,思维缜密的文章,一看就和我平时的风格不同.对了.这不是我写的,是我家高大英俊,写一手好代码,炒一手好菜的男神架构师老公的大作,曾发表于技术公号,经本人授权转载,如有技术问题,我代为请他本人解答~~ 一.Java平台体系及应用场景 从1995年Sun Microsystems公司正式推出Java,到2006年时Sun公司将其开源,迄今为止已经有了20年的历史.Java本身已不仅仅只是一门面向对象的编程语言,而是由一系列计算机软件和规范形成的技术体系,这个技术体系提供了

JAVA VirtualVM远程监控配置

Virtual VM是JDK6 Update7之后推出的工具,有集合其它JDK工具的倾向,目前JDK7的版本已经支持绝大部分的监控功能,好像还不能像Jprofile和Youkit那样支持实时跟踪内存堆栈来定位内存泄露问题. 对于远程应用的连接,Virtual VM提供两种方式:JMX和jstatd,下面介绍这两种连接的配置. JMX: 在远程服务器上的 jdk 目录下的jre/lib/management下找到jmxremote.password.template文件,然后将其复制为pwd.fi

Linux下Java线程详细监控和其dump的分析使用----分析Java性能瓶颈

这里对linux下.sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结: linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: (一):通过[top -p 12377 -H] 查看java进程的有哪些线程的运行情况:       和通过[jstack 12377 > stack.log]生成Java线程的dump详细信息: 先用top命令找出占用资源厉害的java进程id,如图:# top 如上

Elasticsearch and kibana and filebeat 轻量级日志监控系统

Elasticsearch and kibana and filebeat Elasticsearch and kibana and filebeat 轻量级日志监控系统 说明: elasticsearch 依赖java Logstash 依赖于JVM,内存消耗比较高 filebeat go语言轻量级日志监控系统 安装 elasticsearch-6.2.3.tar.gz filebeat-6.2.3-linux-x86_64.tar.gz kibana-6.2.3-linux-x86_64.t