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.
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.
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!
<?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>
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(); } }
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");"启动线程导入用户数据"+
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. SQL-Skript
2. Dateiformat mit dem Namen yyyyMMdd.txtCREATE 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;
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!