zoukankan      html  css  js  c++  java
  • JAVA轻量级文件监控

    原文地址:http://blog.csdn.net/three_man/article/details/31012903?utm_source=tuicool

    介绍

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

     1 package shuai.study.file.generator;
     2 
     3 import java.io.IOException;
     4 import java.nio.file.Files;
     5 import java.nio.file.Paths;
     6 import java.util.Date;
     7 
     8 import org.apache.log4j.Logger;
     9 
    10 import shuai.study.file.tooler.CommonTooler;
    11 
    12 /**
    13  * @author shengshu
    14  * 
    15  */
    16 public class FileGenerator implements Runnable {
    17     private static final Logger LOG = Logger.getLogger(FileGenerator.class);
    18 
    19     private String directory = null;
    20 
    21     private static Date date = new Date();
    22 
    23     public FileGenerator(String directory) {
    24         this.directory = directory;
    25     }
    26 
    27     private void generator(String directory) {
    28         for (int i = 0; i < 10; i++) {
    29             String fileName = CommonTooler.getDateTimeFormat(date) + "-" + Thread.currentThread().getId() + i + ".pm";
    30 
    31             LOG.info("[Path]: " + directory + "/" + fileName);
    32 
    33             try {
    34                 // Create file (path: directory/fileName)
    35                 Files.createFile(Paths.get(directory, fileName));
    36             } catch (IOException ioe) {
    37                 ioe.printStackTrace();
    38             }
    39         }
    40     }
    41 
    42     @Override
    43     public void run() {
    44         this.generator(directory);
    45     }
    46 }
     1 package shuai.study.file.monitor;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 
     6 import org.apache.commons.io.FileUtils;
     7 import org.apache.commons.io.FilenameUtils;
     8 import org.apache.commons.io.filefilter.FileFilterUtils;
     9 import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
    10 import org.apache.commons.io.monitor.FileAlterationMonitor;
    11 import org.apache.commons.io.monitor.FileAlterationObserver;
    12 import org.apache.log4j.Logger;
    13 
    14 import shuai.study.file.tooler.CommonTooler;
    15 
    16 /**
    17  * @author shengshu
    18  * 
    19  */
    20 public class FileMonitor extends FileAlterationListenerAdaptor {
    21     private static final Logger LOG = Logger.getLogger(FileMonitor.class);
    22 
    23     private static FileMonitor fileMonitor;
    24 
    25     private static int pageNumber = 0;
    26 
    27     private FileMonitor() {
    28 
    29     }
    30 
    31     // Get singleton object instance
    32     public static FileMonitor getFileMonitor() {
    33         if (fileMonitor == null) {
    34             synchronized (FileMonitor.class) {
    35                 if (fileMonitor == null) {
    36                     fileMonitor = new FileMonitor();
    37                 }
    38             }
    39         }
    40 
    41         return fileMonitor;
    42     }
    43 
    44     // Create file event
    45     @Override
    46     public void onFileCreate(File file) {
    47         LOG.info("[Create]: " + file.getAbsolutePath());
    48 
    49         String fileAbsolutePath = file.getAbsolutePath();
    50         String fileAbsoluteParentPath = file.getParent();
    51         String fileBaseName = FilenameUtils.getBaseName(fileAbsolutePath);
    52 
    53         File destFile = new File(fileAbsoluteParentPath + File.separator + fileBaseName + "-" + CommonTooler.pagingFormat(pageNumber) + ".xml");
    54 
    55         try {
    56             FileUtils.moveFile(file, destFile);
    57         } catch (IOException ioe) {
    58             ioe.printStackTrace();
    59         }
    60 
    61         pageNumber++;
    62     }
    63 
    64     // Change file event
    65     @Override
    66     public void onFileChange(File file) {
    67         LOG.info("[Change]: " + file.getAbsolutePath());
    68     }
    69 
    70     // Delete file event
    71     @Override
    72     public void onFileDelete(File file) {
    73         LOG.info("[Delete]: " + file.getAbsolutePath());
    74     }
    75 
    76     public void monitor(String directory, int interval) {
    77         // Observer file whose suffix is pm 
    78         FileAlterationObserver fileAlterationObserver = new FileAlterationObserver(directory, FileFilterUtils.and(FileFilterUtils.fileFileFilter(),
    79                 FileFilterUtils.suffixFileFilter(".pm")), null);
    80 
    81         // Add listener for event (file create & change & delete)
    82         fileAlterationObserver.addListener(this);
    83 
    84         // Monitor per interval
    85         FileAlterationMonitor fileAlterationMonitor = new FileAlterationMonitor(interval, fileAlterationObserver);
    86 
    87         try {
    88             // Start to monitor
    89             fileAlterationMonitor.start();
    90         } catch (Exception e) {
    91             e.printStackTrace();
    92         }
    93     }
    94 }
     1 package shuai.study.file.tester;
     2 
     3 import java.io.IOException;
     4 import java.nio.file.Files;
     5 import java.nio.file.Paths;
     6 
     7 import org.apache.log4j.Logger;
     8 
     9 import shuai.study.file.generator.FileGenerator;
    10 import shuai.study.file.monitor.FileMonitor;
    11 
    12 /**
    13  * @author shengshu
    14  * 
    15  */
    16 public class FileTester {
    17     private static final Logger LOG = Logger.getLogger(FileTester.class);
    18 
    19     private static String directory = "/home/omc/tmp";
    20 
    21     public static void main(String[] args) {
    22         // Create directory if it does not exist 
    23         try {
    24             Files.createDirectory(Paths.get(directory));
    25         } catch (IOException ioe) {
    26             ioe.printStackTrace();
    27         }
    28 
    29         LOG.info("File Monitor...");
    30         // Start to monitor file event per 500 milliseconds
    31         FileMonitor.getFileMonitor().monitor(directory, 500);
    32 
    33         LOG.info("File Generater...");
    34         // New runnable instance
    35         FileGenerator fileGeneratorRunnable = new FileGenerator(directory);
    36 
    37         // Start to multi-thread for generating file
    38         for (int i = 0; i < 10; i++) {
    39             Thread fileGeneratorThread = new Thread(fileGeneratorRunnable);
    40             fileGeneratorThread.start();
    41         }
    42     }
    43 
    44 }
     1 package shuai.study.file.tooler;
     2 
     3 import java.text.SimpleDateFormat;
     4 import java.util.Date;
     5 
     6 /**
     7  * @author shengshu
     8  * 
     9  */
    10 public class CommonTooler {
    11 
    12     // Date time format
    13     public static String getDateTimeFormat(Date date) {
    14         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd-HHmm");
    15         String dateTime = simpleDateFormat.format(date);
    16 
    17         return dateTime;
    18     }
    19 
    20     // Page format
    21     public static String pagingFormat(int pageNumber) {
    22         String pageNumberStr = "P00";
    23 
    24         if (pageNumber < 0) {
    25             throw new NumberFormatException("The page number should not be negative");
    26         }
    27 
    28         if (pageNumber < 10) {
    29             pageNumberStr = String.format("P0%d", pageNumber);
    30         } else {
    31             pageNumberStr = String.format("P%d", pageNumber);
    32         }
    33 
    34         return pageNumberStr;
    35     }
    36 
    37 }
    作者:TinyKing
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    JavaScript 电话手机号码正则表达式
    查找和删除sqlserver数据库中的重复记录
    配置文件app.config
    数据类型 ntext 和 varchar 在 equal to 运算符中不兼容的错误信息
    用jscript处理repeater生成的表格, 实现分页打印
    我在Repeater控件中有CheckBox控件,我怎么能选中CheckBox控件后,Repeater控件重新绑定一下?
    种方式遍历repeater中的CheckBox全选
    Repeater导出为excel格式
    给Repeater、Datalist和Datagrid增加自动编号
    js中对datagrid ,repeater的checkbox进行全选反选
  • 原文地址:https://www.cnblogs.com/tinyking/p/4500781.html
Copyright © 2011-2022 走看看