JAVA轻量级文件监控

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

介绍

    本文主要介绍一种轻量级的文件监控方式,对文件的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;
	}

}

相关文章
|
1月前
|
缓存 NoSQL Java
一个轻量级 Java 权限认证框架——Sa-Token
Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。
|
1月前
|
Java 开发工具 Android开发
【详识JAVA语言】轻量级开发工具:BlueJ
【详识JAVA语言】轻量级开发工具:BlueJ
19 2
|
8月前
|
监控 Java 测试技术
探索轻量级Java开发:Spring Boot 介绍与特性解析
在现代的软件开发领域,快速、高效地构建可靠的应用程序变得至关重要。Spring Boot,作为Spring Framework家族中的一员,正是为了满足这一需求而诞生的。本文将为您介绍 Spring Boot 的基本概念、特性以及为什么它在Java开发中如此受欢迎。
98 0
|
9月前
|
安全 Java 调度
Java中重量级和轻量级的区别及应用场景
Java作为一种面向对象的编程语言,在开发中经常会遇到重量级和轻量级的概念。本文将详细介绍Java中重量级和轻量级的区别,并探讨它们在实际开发中的应用场景。
390 0
|
11月前
|
Java 编译器 数据格式
Protobuf:一种轻量级、高效的数据交换格式,附Java与Python数据交换示例
Protobuf:一种轻量级、高效的数据交换格式,附Java与Python数据交换示例
195 0
|
缓存 监控 算法
Google Aviator——轻量级 Java 表达式引擎实战
Drools(JBoss Rules )是一个开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
835 0
Google Aviator——轻量级 Java 表达式引擎实战
|
前端开发 Java 微服务
JAVA轻量级错误码设计最佳实践
JAVA轻量级错误码设计最佳实践
1353 0
JAVA轻量级错误码设计最佳实践
Java:HttpServer提供轻量级http服务
Java:HttpServer提供轻量级http服务
137 0
|
XML 开发框架 前端开发
3分钟带你了解:轻量级依赖注入框架Google Guice【享学Java】(下)
3分钟带你了解:轻量级依赖注入框架Google Guice【享学Java】(下)
|
druid Java 程序员
3分钟带你了解:轻量级依赖注入框架Google Guice【享学Java】(上)
3分钟带你了解:轻量级依赖注入框架Google Guice【享学Java】(上)