ホームページ  >  記事  >  Java  >  Java は WatchService を使用してディレクトリ内のファイルの変更をリアルタイムで監視し、行ごとに解析します。

Java は WatchService を使用してディレクトリ内のファイルの変更をリアルタイムで監視し、行ごとに解析します。

怪我咯
怪我咯オリジナル
2017-06-25 10:11:281706ブラウズ

まず最初に、要件について説明します: 合意された形式でファイルを FTP 経由でサーバー上の指定されたディレクトリにアップロードします。アップロードされたファイル形式が条件を満たしている場合、アプリケーションはディレクトリ内のファイルの変更をリアルタイムで監視できます。要件を満たしている場合、各行を読み取って解析し、それをデータベースに書き込み、解析後にファイルの名前を変更します。

1. 最初のアイデア

指定されたディレクトリ内のファイルの変更を 1 分ごとに読み取るスケジュールされたタスクを設定します。形式に一致するファイルがある場合は、それらを解析します。

この方法は非常に面倒で非効率です。状態のトラバース、保存、比較にすべての効率が消費されます。 また、OS の多くの機能を活用できなくなります。

2. WatchService の概要

1. このクラスのオブジェクトは、オペレーティング システムのネイティブ ファイル システム モニターです。 OS 独自のファイル システム モニターがシステム上のすべてのファイルの変更を監視できることは誰もが知っています。この種の監視では、信号の送受信に基づいた監視が行われるため、効率が最も高くなります。パッケージ化後、Java プログラムで OS ファイル システム モニターを直接使用できます。

i. WatchService watcher = FileSystems.getDefault().newWatchService() ;

ii. クラス名 FileSystems から、これが OS プラットフォームのファイル システムに属していることがわかります。

理解する必要はありません。この一連の方法については、ここで詳しく説明します。最初にその使用方法を知っておく必要があります。オペレーティング システムで複数のモニターを同時にオンにできることは誰もが知っています。 Java プログラムでは例外はなく、同じコードを使用して複数のモニターを同時に取得することもできます。

4. モニターは、実際にはファイルの変更によって送信されるシグナルを監視するバックグラウンド スレッドです。ここで上記のコードを通じて取得されたモニターは、単に新しく初期化されたスレッドであり、準備完了状態にもなっていません。

3. 実装プロセス

初期化中にスレッドを作成し、watchService を使用してディレクトリ内のファイルの変更をリアルタイムで監視し、条件を満たすファイルがあれば追加され、合意された形式に従ってファイルを解析してデータベースに書き込みます。詳しい手順は以下の通りです!

1. Web.xmlリスナー設定ファイルでリスナーを監視します

930406f08da8ee4a2ff134b688d29d1dcd65b3a4eec0dfd2b520f594bda16a0f75d9475f58d50d678ef97bf7ae35ef75c13d9669d2c8f87a36a39c8f95f41552contextConfigLocation02b9ad8b27bc78bd91c18db845cdde4af226acac8cb0e4a9d59fcba58b57a899classpath:root-context.xml22c8aeb51b7638a9da01bd5a66154ac11c0ed9b29d4061c50424e545cf7b2ba51d24e586ca31f4bd05eca427459d98c7f573a9ccb524cb86b6b9919be70810beCharacterEncodingFilterb4d5e6fde2c78ede331e20c60d37da11e5b954f5d6752e2b67f5dbec1cf5c85eorg.springframework.web.filter.CharacterEncodingFilter3c5315e9114c0f42d7a83b06562caa88380fae52cc7d04565d26dd4bbf4b5460c13d9669d2c8f87a36a39c8f95f41552encoding02b9ad8b27bc78bd91c18db845cdde4af226acac8cb0e4a9d59fcba58b57a899UTF-822c8aeb51b7638a9da01bd5a66154ac18f161518881ffd7712eaaadc573a3556380fae52cc7d04565d26dd4bbf4b5460c13d9669d2c8f87a36a39c8f95f41552forceEncoding02b9ad8b27bc78bd91c18db845cdde4af226acac8cb0e4a9d59fcba58b57a899true22c8aeb51b7638a9da01bd5a66154ac18f161518881ffd7712eaaadc573a355694e66dfbd9fa8f117002935bdd35d0b3dd0dfb26ea66647667f179a739921d33f573a9ccb524cb86b6b9919be70810beCharacterEncodingFilterb4d5e6fde2c78ede331e20c60d37da1166e1775cbd9d5002635ae3285442ba88/*3ec4a5583206d351b61ed79c1a0f9c66e354d6d34e50ca0d695db95544b3672a1d24e586ca31f4bd05eca427459d98c7f573a9ccb524cb86b6b9919be70810besitemeshb4d5e6fde2c78ede331e20c60d37da11e5b954f5d6752e2b67f5dbec1cf5c85ecom.opensymphony.sitemesh.webapp.SiteMeshFilter3c5315e9114c0f42d7a83b06562caa8894e66dfbd9fa8f117002935bdd35d0b3dd0dfb26ea66647667f179a739921d33f573a9ccb524cb86b6b9919be70810besitemeshb4d5e6fde2c78ede331e20c60d37da1166e1775cbd9d5002635ae3285442ba88/*3ec4a5583206d351b61ed79c1a0f9c66e354d6d34e50ca0d695db95544b3672a46309ed845064fdb06e746051efff9e0700b5f17c4d842e4bd410f680f40946bappServlet72eca723e64ddd01187c8b4d58572fcbb472d9135dbff3dd7fcc77f5995c97d0org.springframework.web.servlet.DispatcherServlet4f01b97d64aea37f699ead4eb7bd2bbd380fae52cc7d04565d26dd4bbf4b5460c13d9669d2c8f87a36a39c8f95f41552contextConfigLocation02b9ad8b27bc78bd91c18db845cdde4af226acac8cb0e4a9d59fcba58b57a899classpath:servlet-context.xml22c8aeb51b7638a9da01bd5a66154ac18f161518881ffd7712eaaadc573a35564781e2cbaa93c386271b418d3a01af0813065abc64b27fbca30c0905ab93e8ea020d42bb762ac7d7e594da3a264e47fcc870ae7edaa11700bcea972d006efb06e700b5f17c4d842e4bd410f680f40946bappServlet72eca723e64ddd01187c8b4d58572fcb66e1775cbd9d5002635ae3285442ba88/3ec4a5583206d351b61ed79c1a0f9c66cb808b0e21d3ee32c89fe10adc3f12ecf3f5604d5528b766199471609c7e722eeae7f28921fa176b20e23abb843be0905948543310f2c9ae6eabc90d07fdac18org.springframework.web.context.ContextLoaderListenera5cb73ed00d90e1dafbf6168c4a676c2f26bc28f07f75d604e1d9c5e7de10123de02ef028bd8b9a79de42b2beabf35ebeae7f28921fa176b20e23abb843be0905948543310f2c9ae6eabc90d07fdac18com.zealer.ad.listener.ThreadStartUpListensera5cb73ed00d90e1dafbf6168c4a676c2f26bc28f07f75d604e1d9c5e7de10123eae7f28921fa176b20e23abb843be0905948543310f2c9ae6eabc90d07fdac18com.zealer.ad.listener.SessionLifecycleListenera5cb73ed00d90e1dafbf6168c4a676c2f26bc28f07f75d604e1d9c5e7de10123
    f0e92f654589c392f4bce55576ef09df  f1e8976e483ae51232e262b5342c464c   fa71b69717bc99e9a78fbc85d8a96339/tag09895297a0aa8662f06901bffdbb71d1   96344b67689bfb9376de746be45b7a6b/WEB-INF/tag/tag.tldbafd8e2dbced6979955b7cae9142033d  328c2203205d81cf46ea0b2c6a2671eeec05f097bfa9cd9364ff55ce9622d108145f58f625840b9ea02ee646738753d64dc738b987c616c936501769be741a6eindex.jsp61b13b5331cf95fd092fcea0d23c370c300e6fadd23fafd1b065a779b865fda92154b31975826eec7c9ecbf8f296fb33ac238ff21ee5e16243d046a43ee626d2453152a4ea4663b36e0b3abf7880663fbce74d0d5e0feeabcbab17c56a2dfd7fed9ec23d40699efb4cb39a61797a06a5a1

2. ThreadStartUpListenserクラスを記述してServletContextListenerを実装し、Tomcat起動時にバックグラウンドスレッドを作成します

ThreadStartUpListenser.java

package com.zealer.ad.listener;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.stereotype.Component;import com.zealer.ad.task.WatchFilePathTask;

@Componentpublic class ThreadStartUpListenser implements ServletContextListener
{private static WatchFilePathTask r = new WatchFilePathTask();private Log log = LogFactory.getLog(ThreadStartUpListenser.class);    /* * tomcat启动的时候创建一个线程
     * */@Overridepublic void contextInitialized(ServletContextEvent paramServletContextEvent)
    {
        r.start();
        log.info("ImportUserFromFileTask is started!");
    }    /* * tomcat关闭的时候销毁这个线程
     * */@Overridepublic void contextDestroyed(ServletContextEvent paramServletContextEvent)
    {
        r.interrupt();
    }

}
3.作成ディレクトリファイル変更監視クラスを指定します
WatchFilePathTask.java

  WatchFilePathTask  Log log = LogFactory.getLog(WatchFilePathTask.   String filePath = ConfigUtils.getInstance().getValue("userfile_path" watchService ="获取监控服务"+="@@@:Path:"+ String todayFormat = DateTime.now().toString("yyyyMMdd"= = existFiles.listFiles( ((todayFormat+".txt"  ( !=ImportUserFromFileTask task = (ImportUserFromFileTask) SpringUtils.getApplicationContext().getBean("importUserFromFileTask"WatchKey key = (= (WatchEvent6b3d0130bba23ae47fe2b8e8cddf0195String fileName =((todayFormat+".txt"= path.toFile().getAbsolutePath()+File.separator+"import filePath:"+ImportUserFromFileTask task = (ImportUserFromFileTask) SpringUtils.getApplicationContext().getBean("importUserFromFileTask");"启动线程导入用户数据"+

4. WatchFilePathTaskによって開始される解析ユーザーファイルとインポートデータベーススレッドを作成します

package com.zealer.ad.task;import com.zealer.ad.entity.AutoPutUser;import com.zealer.ad.entity.Bmsuser;import com.zealer.ad.service.AutoPutUserService;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.joda.time.DateTime;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import java.util.Date;import javax.annotation.Resource;/**
 * 解析用户文件及入库线程,由WatchFilePathTask启动
 * @author cancer
 * */public class ImportUserFromFileTask extends Thread {private Log log = LogFactory.getLog(ImportUserFromFileTask.class);private String fileName;
    @Resource(name = "autoPutUserService")private AutoPutUserService autoPutUserService;

    @Overridepublic void run() {
        File file = new File(fileName);if (file.exists() && file.isFile()) {
            log.debug(":@@@准备开始休眠10秒钟:" + file);//休眠十分钟,防止文件过大还没完全拷贝到指定目录下,这里的线程就开始读取文件try {
                sleep(10000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }

            InputStreamReader read;try {
                read = new InputStreamReader(new FileInputStream(file), "UTF-8");

                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;int count = 0;
                Boolean f = false;while ((lineTxt = bufferedReader.readLine()) != null) {if ((null == lineTxt) || "".equals(lineTxt)) {continue;
                    }if (lineTxt.startsWith("'")) {
                        lineTxt = lineTxt.substring(1, lineTxt.length());
                    }//解析分隔符为', 'String[] lines = lineTxt.split("', '");int length = lines.length;if (length < 2) {continue;
                    }

                    Bmsuser bmsuser = new Bmsuser();
                    bmsuser.setName(lines[0]);if (!"".equals(lines[1])) {
                        bmsuser.setCity(lines[1]);
                    }
            //根据唯一索引已经存在的数据则不插入f = autoPutUserService.insertIgnore(bmsuser);if (f) {
                        count++;
                    }
                }//汇总数据AutoPutUser autoPutUser = new AutoPutUser();
                autoPutUser.setTotalCount(autoPutUserService.getUserCount());
                autoPutUser.setCount(count);
                autoPutUser.setCountDate(new Date(System.currentTimeMillis()));

                String today = DateTime.now().toString("yyyy-MM-dd");
                Integer oldCount = autoPutUserService.getOldCount(today);//如果今天导入过了就更新否则插入if (!oldCount.equals(0)) {
                    autoPutUserService.updateUserData(autoPutUser, today,
                        oldCount);
                } else {
                    autoPutUserService.gatherUserData(autoPutUser);
                }//注意:要关闭流                read.close();
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }

            File newFile = new File(file.getPath() +System.currentTimeMillis() + ".complate");
            file.renameTo(newFile);
        } else {
            log.error(fileName + " file is not exists");
        }
    }public String getFileName() {return fileName;
    }public void setFileName(String fileName) {this.fileName = fileName;
    }public AutoPutUserService getAutoPutUserService() {return autoPutUserService;
    }public void setAutoPutUserService(AutoPutUserService autoPutUserService) {this.autoPutUserService = autoPutUserService;
    }
}

付属:
1.

CREATE TABLE `bmsuser` (
  `id` int(255) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL ,
  `city` varchar(32) DEFAULT NULL COMMENT ,  PRIMARY KEY (`bmsid`),  UNIQUE KEY `bbLoginName` (`bbLoginName`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

2. yyyyMMdd.txt という名前のファイル形式

&#39;张三&#39;, &#39;深圳&#39;

以上がJava は WatchService を使用してディレクトリ内のファイルの変更をリアルタイムで監視し、行ごとに解析します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。