介绍
本文主要介绍一种轻量级的文件监控方式,对文件的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业务风控系统 基于Spring boot构建,配置文件能少则少 使用drools规则引擎管理风控规则,原则上可以动态配置规则 使用redis、mongodb做风控计算和事件储存,历史事件支持水平扩展 原理 ...
Active4j-Boot是基于SpingBoot2.0轻量级的java快速开发框架。以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache Shiro为权限授权层, Redis为分布式缓存,Quartz为...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
Active4j-boot是基于SpingBoot2.0轻量级的java快速开发框架。以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache Shiro为权限授权层, Redis为分布式缓存,Quartz为...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
前 言 致 谢 第一部分 走近Java 第...358 13.3.4 轻量级锁 / 358 13.3.5 偏向锁 / 361 13.4 本章小结 / 362 附录A Java虚拟机家族 / 363 附录B 虚拟机字节码指令表 / 366 附录C HotSpot虚拟机主要参数表 / 372