Maison > Java > javaDidacticiel > le corps du texte

Java utilise WatchService pour surveiller les modifications de fichiers dans un répertoire en temps réel et les analyser ligne par ligne. Exemple détaillé.

怪我咯
Libérer: 2017-06-25 10:11:28
original
1712 Les gens l'ont consulté

Tout d'abord, parlons des exigences : Téléchargez les fichiers dans le format convenu dans le répertoire spécifié sur le serveur via FTP. L'application peut surveiller les modifications apportées aux fichiers dans le répertoire en temps réel si le format de fichier téléchargé. répond aux exigences, il lira et analysera chaque ligne avant d'écrire. Entrez dans la base de données et renommez le fichier après l'analyse.

1. L'idée initiale

Configurer une tâche planifiée pour lire les modifications de fichiers dans le répertoire spécifié toutes les minutes. Analysez-le simplement.

Cette méthode est très lourde et inefficace. Toute l'efficacité est consommée dans le parcours, la sauvegarde de l'état et la comparaison de l'état ! Et vous ne pouvez pas profiter de nombreuses fonctionnalités du système d’exploitation.

2. Introduction à WatchService

1. L'objet de cette classe est le moniteur de système de fichiers natif du système d'exploitation ! Nous savons tous que le propre moniteur du système de fichiers du système d'exploitation peut surveiller les modifications de tous les fichiers du système. Ce type de surveillance ne nécessite pas de parcours ou de comparaison. Il s'agit d'une surveillance basée sur l'envoi et la réception de signaux, l'efficacité doit donc être la plus élevée. maintenant Java a Après l'emballage, vous pouvez utiliser le moniteur du système de fichiers du système d'exploitation directement dans les programmes Java ;

2. Obtenez le moniteur du système de fichiers sous la plate-forme actuelle du système d'exploitation :

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

ii. À partir du nom de classe FileSystems, nous pouvons voir que cela doit appartenir au système de fichiers de la plate-forme du système d'exploitation. Ensuite, nous pouvons voir que cette série de méthodes peut être obtenue directement. une surveillance de fichiers

Il n'est pas nécessaire de comprendre en profondeur la signification spécifique de cette chaîne de méthodes, il suffit de savoir d'abord comment l'utiliser

3. être ouvert en même temps sur le système d'exploitation. Par conséquent, cela ne fait pas exception dans les programmes Java. Le code ci-dessus n'obtient qu'un seul moniteur. Vous pouvez également utiliser le même code pour obtenir plusieurs moniteurs en même temps

4. Le moniteur est en fait un thread d'arrière-plan. Le signal envoyé par le fichier de surveillance en arrière-plan change. Le moniteur obtenu ici via le code ci-dessus n'est même pas entré dans l'état prêt, il est juste initialisé ;

3. Le processus d'implémentation

consiste en fait à créer un thread lors de l'initialisation, puis à utiliser watchService pour surveiller les modifications de fichiers dans le répertoire en temps réel s'il s'agit d'un fichier. qui remplit les conditions est ajouté, le fichier sera analysé selon le format convenu puis écrit dans la base de données Détails Voici les étapes !

1. Le fichier de configuration de l'écouteur web.xml surveille l'écouteur

<?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>
Copier après la connexion
2. Écrivez une classe ThreadStartUpListener pour implémenter ServletContextListener et créez un thread d'arrière-plan au démarrage de Tomcat

 

ThreadStartUpListender.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();
    }

}
Copier après la connexion
  3. Créez une classe de surveillance des modifications de fichiers de répertoire spécifiée

 

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 = (= (WatchEvent<?>String fileName =((todayFormat+".txt"= path.toFile().getAbsolutePath()+File.separator+"import filePath:"+ImportUserFromFileTask task = (ImportUserFromFileTask) SpringUtils.getApplicationContext().getBean("importUserFromFileTask");"启动线程导入用户数据"+
Copier après la connexion
4. Créez un fil de discussion pour analyser les fichiers utilisateur et importer la base de données, démarré par 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;
    }
}
Copier après la connexion

Livré avec :

1. script SQL

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;
Copier après la connexion
2. Format de fichier, nommé aaaaMMjj.txt

&#39;张三&#39;, &#39;深圳&#39;
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!