JAVA轻量级文件监控
原文地址:http://blog.csdn.net/three_man/article/details/31012903?utm_source=tuicool
介绍
本文主要介绍一种轻量级的文件监控方式,对文件的Create & Change & Delete,都有一个对应的Event方法来进行处理。对于核心的File Monitor Class,我们继承一个监听适配器类FileAlterationListenerAdaptor,这样会更方便,就不用再去重写每个Event方法。
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);
}
}
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();
}
}
}
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();
}
} }
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轻量级文件监控的更多相关文章
- java实现文件监控
文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...
- Springboot之文件监控
背景:在实际环境部署构成中,由于特殊网络环境因素,有很多服务器之间的网络都是单向的,不能互相访问的,只有通过特定技术手段做到文件的单项摆渡,这就需要在两台服务器上分别写序列化程序和反序列化程序,这里不 ...
- Java实现文件夹下文件实时监控
一.commons-io方法 1.使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的 (1)可以监控文件夹的创建.删除和修改 (2)可以监控文件的创 ...
- 基于 JVMTI 实现 Java 线程的监控(转)
随着多核 CPU 的日益普及,越来越多的 Java 应用程序使用多线程并行计算来充分发挥整个系统的性能.多线程的使用也给应用程序开发人员带来了巨大的挑战,不正确地使用多线程可能造成线程死锁或资源竞争, ...
- 干货 | 云智慧透视宝Java代码性能监控实现原理
这篇图文并茂,高端大气上档次,思维缜密的文章,一看就和我平时的风格不同.对了.这不是我写的,是我家高大英俊,写一手好代码,做一手好菜的男神老公的大作,曾发表于技术公号,经本人授权转载~~ 一.Java ...
- Java 服务端监控方案(四. Java 篇)
http://jerrypeng.me/2014/08/08/server-side-java-monitoring-java/ 这个漫长的系列文章今天要迎来最后一篇了,也是真正与 Java 有关的部 ...
- Java虚拟机性能监控与调优实战
From: https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...
- 一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包
欢迎关注笔者的公众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!! 个人网站: https://www.exception.site/essay/create-tar-gz-by-j ...
- 文件监控性能问题【BUG】
文件监控性能问题[BUG] 背景:JAVA写了一个文件夹目录监控的程序,使用的是org.apache.commons.io.monitor 包,项目稳定运行了一个月,现场反馈,文件夹数据处理越来越慢, ...
随机推荐
- dedecms 的这个dede:arclist里怎么调用全局变量?
将{dede:global.cfg_templets_skin/} 写为 [field:global.cfg_templets_skin/] 即可.
- IWorkspaceFactory接口
When To Use Use IWorkspaceFactory when you need to create a new workspace, connect to an existing wo ...
- posix第二篇-----linux 锁机制
1 简介 锁机制(lock) 是多线程编程中最常用的同步机制,用来对多线程间共享的临界区(Critical Section) 进行保护. Pthreads提供了多种锁机制,常见的有: 1) Mutex ...
- (干货)一次httpclient的close_wait问题的探讨
从图中可以看出,如果客户端被动关闭连接,且没有向服务器端发送FIN,则会一直处于CLOSE_WAIT状态. 处理服务器在处理完请求,与后端Nginx之间的连接仍然保持着CLOSE_WAIT状态,个数为 ...
- Nginx + Apache 反向代理
反向代理负载均衡 使用代理服务器可以将请求转发给内部的Web服务器,使用这种加速模式显然可以提升静态网页的访问速度.因此也可以考虑使用这种技术,让代理服务器将请求均匀转发给多台内部Web服务器之一上, ...
- Laravel邮件发送问题小解
在Laravel中已经有内置了发送邮件的功能,通过 Mail::send 可发送邮件,但要使用这个函数必须先进行相关配置. 在 /app/config/mail.php 中设置你的邮件参数,如下: 1 ...
- EQueue - 一个C#写的开源分布式消息队列的总体介绍(转)
源: EQueue - 一个C#写的开源分布式消息队列的总体介绍 EQueue - 一个纯C#写的分布式消息队列介绍2 EQueue - 详细谈一下消息持久化以及消息堆积的设计
- Mysql导入zabbix的sql语句时报错:ERROR 1045 (28000)
#Warning: Using a password on the command line interface can be insecure.#ERROR 1045 (28000): Access ...
- IOS9提示“不受信任的开发者”如何处理
iPhone升级到IOS9版本后,发现部分APP在下载后首次运行时,都会提示“不受信任的应用程序开发者”,这是因为企业证书发布的APP,没有经过AppStore审核,于是iOS对用户做出一个安全性的提 ...
- [转]tar 分包压缩与合并
要将目录logs打包压缩并分割成多个1M的文件,可以用下面的命令: tar cjf - logs/ |split -b 1m - logs.tar.bz2. 完成后会产生下列文件: logs.ta ...