Heim > Java > javaLernprogramm > Java verwendet WatchService, um Dateiänderungen in einem Verzeichnis in Echtzeit zu überwachen und sie Zeile für Zeile zu analysieren

Java verwendet WatchService, um Dateiänderungen in einem Verzeichnis in Echtzeit zu überwachen und sie Zeile für Zeile zu analysieren

怪我咯
Freigeben: 2017-06-25 10:11:28
Original
1763 Leute haben es durchsucht

Lassen Sie uns zunächst über die Anforderungen sprechen: Laden Sie Dateien im vereinbarten Format über FTP in das angegebene Verzeichnis auf dem Server hoch. Die Anwendung kann die Änderungen in den Dateien im Verzeichnis in Echtzeit überwachen Wenn die Anforderungen erfüllt sind, wird jede Zeile vor dem Schreiben gelesen und analysiert. Geben Sie die Datei ein und benennen Sie sie nach dem Parsen um.

Die ursprüngliche Idee

Richten Sie eine geplante Aufgabe ein, um die Dateiänderungen im angegebenen Verzeichnis jede Minute zu lesen. Analysieren Sie es einfach.

Diese Methode ist sehr umständlich und ineffizient beim Durchlaufen, Speichern des Zustands und Vergleichen des Zustands! Und Sie können viele Funktionen des Betriebssystems nicht nutzen.

2. Einführung in WatchService

1. Das Objekt dieser Klasse ist der native Dateisystemmonitor des Betriebssystems! Wir alle wissen, dass der Dateisystemmonitor des Betriebssystems Änderungen in allen Dateien im System überwachen kann. Es handelt sich um eine Überwachung, die auf dem Senden und Empfangen von Signalen basiert. Daher muss die Effizienz am höchsten sein. Jetzt kann Java nach dem Packen den Dateisystemmonitor direkt in Java-Programmen verwenden:

i .getDefault().newWatchService();

ii. Aus dem Klassennamen FileSystems können wir ersehen, dass dies zum Dateisystem der Betriebssystemplattform gehören muss eine Dateiüberwachung

Es ist nicht nötig, die spezifische Bedeutung dieser Methodenkette im Detail zu verstehen, sondern nur zu wissen, wie man sie verwendet

3 Daher ist dies in Java-Programmen keine Ausnahme. Sie können denselben Code auch verwenden, um mehrere Monitore gleichzeitig zu erhalten > 4. Der Monitor ist tatsächlich ein Hintergrund-Thread, der durch den obigen Code gesendet wird. Er ist noch nicht einmal in den Bereitschaftszustand eingetreten.

3. Der Implementierungsprozess

besteht tatsächlich darin, während der Initialisierung einen Thread zu erstellen und dann watchService zu verwenden, um Dateiänderungen im Verzeichnis in Echtzeit zu überwachen Wenn eine Datei hinzugefügt wird, die die Bedingungen erfüllt, wird sie gemäß dem vereinbarten Format analysiert und dann in die Datenbank geschrieben. Details Hier sind die Schritte!

1. Die Listener-Konfigurationsdatei web.xml überwacht den Listener

2. Schreiben Sie eine ThreadStartUpListenser-Klasse, um ServletContextListener zu implementieren und einen Hintergrundthread zu erstellen, wenn Tomcat gestartet wird
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    "><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:root-context.xml</param-value></context-param><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>sitemesh</filter-name><filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class></filter><filter-mapping><filter-name>sitemesh</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>appServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:servlet-context.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>appServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 配置spring监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 配置监控文件变化监听器 --><listener><listener-class>com.zealer.ad.listener.ThreadStartUpListenser</listener-class></listener><listener><listener-class>com.zealer.ad.listener.SessionLifecycleListener</listener-class></listener>
    <jsp-config>  <taglib>   <taglib-uri>/tag</taglib-uri>   <taglib-location>/WEB-INF/tag/tag.tld</taglib-location>  </taglib></jsp-config><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><session-config><session-timeout>45</session-timeout></session-config></web-app>
Nach dem Login kopieren
 
ThreadStartUpListenser.java

  3. Erstellen Sie eine angegebene Verzeichnisdateiänderungsüberwachungsklasse
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();
    }

}
Nach dem Login kopieren
 
WatchFilePathTask .java

4. Erstellen Sie einen Thread zum Parsen von Benutzerdateien und Importieren der Datenbank, gestartet von WatchFilePathTask
  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 = (= (WatchEvent<?>String fileName =((todayFormat+".txt"= path.toFile().getAbsolutePath()+File.separator+"import filePath:"+ImportUserFromFileTask task = (ImportUserFromFileTask) SpringUtils.getApplicationContext().getBean("importUserFromFileTask");"启动线程导入用户数据"+
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren
Kommt mit:

1. SQL-Skript

2. Dateiformat mit dem Namen yyyyMMdd.txt
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;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonJava verwendet WatchService, um Dateiänderungen in einem Verzeichnis in Echtzeit zu überwachen und sie Zeile für Zeile zu analysieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage