JAVA轻量级文件监控
2023-09-11 14:21:02 时间
介绍
本文主要介绍一种轻量级的文件监控方式,对文件的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】JAVA中的运算符及优先级(转)
- Java if判断对象为null时,null放在比较运算符的左边还是右边?哪种才是java标准?进来看看你就知道了
- Java问题啊
- Java String StringBuffer StringBuilder 效率测试
- JAVA础--利用java反射机制绕过编译时的类型检查和访问控制检查
- Caused by: java.lang.RuntimeException: java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ
- 【Java】java数据库连接池配置的几种方法
- 【Java】Java TCP/IP Socket编程
- IntelliJ IDEA中如何优雅的调试Java Stream操作
- 《Java遗传算法编程》—— 第1章 简介 1.1 什么是人工智能
- Java 并发工具包 java.util.concurrent 大全
- 1. java.util.concurrent - Java 并发工具包
- java.lang.OutOfMemoryError: Java heap space
- Java学习-084-java.sql.SQLException: Zero date value prohibited 问题解决
- 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space
- 在java中使用JMH(Java Microbenchmark Harness)做性能测试
- java之 22天 GUI 图形界面编程(二)
- Java多线程之ExecutorService使用说明
- JAVA实用技巧总结
- Java 空心菱形
- 从零学Java(19)之 if else分支结构详解,小AD要搞对面心态!
- Java笔记14:泛型初探
- Java IDEA 项目崩溃后还原
- Java wait、notify与synchronized的奇妙之处