一. spring配置文件:application.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" 4 xmlns:context="http://www.springframework.org/schema/context" xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr" 5 xmlns:jaxrs="http://cxf.apache.org/jaxrs" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 7 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 8 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 10 http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd 11 http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> 12 13 <!-- 文件監測器 --> 14 <bean id="monitor" 15 class="com.interfaces.file.monitor.FileMonitorImpl"> 16 17 <constructor-arg index="0" value="10000" /> <!-- 監測時間間隔,單位:毫秒 --> 18 <constructor-arg index="1" ref="observer" /> <!-- 文件觀察器 --> 19 </bean> 20 21 <!-- 文件觀察器 --> 22 <bean id="observer" 23 class="com.interfaces.file.monitor.FileObserverImpl"> 24 25 <constructor-arg index="0" value="D:\\UploadDir"/> <!-- 觀察的目錄 --> 26 <constructor-arg index="1" ref="filter"/> <!-- 文件過濾器--> 27 <constructor-arg index="2" ref="listener"/> <!-- 文件監聽器 --> 28 </bean> 29 30 <!-- 文件監聽器 --> 31 <bean id="listener" 32 class="com.interfaces.file.monitor.FileListener"/> 33 34 <!-- 文件過濾器 --> 35 <bean id="filter" 36 class="com.interfaces.file.monitor.FileFilterImpl"> 37 <!-- 38 指定文件擴展名,只有指定的擴展名文件會被處理。 39 不同的擴展名間以 "," 間隔,如:xml,txt,bak 40 --> 41 <constructor-arg index="0" value="xml"/> 42 </bean> 43 </beans> View Code
二. spring上下文加載監聽器:SpringContextLoaderListener.class
1 import javax.servlet.ServletContextEvent; 2 3 import org.springframework.web.context.ContextLoaderListener; 4 5 public class SpringContextLoaderListener extends ContextLoaderListener{ 6 7 @Override 8 public void contextInitialized(ServletContextEvent event) { 9 super.contextInitialized(event); 10 11 FileMonitor scanner = getScanner(); 12 13 // 啟動目錄掃描器 14 scanner.start(); 15 } 16 17 @Override 18 public void contextDestroyed(ServletContextEvent event) { 19 FileMonitor scanner = getScanner(); 20 21 // 關閉目錄掃描器 22 scanner.stop(); 23 24 super.contextDestroyed(event); 25 } 26 27 /** 28 * 獲取目錄掃描器 29 * @return 30 */ 31 private FileMonitor getScanner() { 32 return getCurrentWebApplicationContext().getBean(FileMonitor.class); 33 } 34 } View Code
三. web工程配置文件:web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.4"> 3 <context-param> 4 <param-name>contextConfigLocation</param-name> 5 <param-value> 6 classpath:application.xml 7 </param-value> 8 </context-param> 9 <listener> 10 <listener-class>com.web.SpringContextLoaderListener</listener-class> 11 </listener> 12 13 </web-app> View Code
四. 文件監測器
1. 接口:FileMonitor.class
1 import org.apache.commons.io.monitor.FileAlterationObserver; 2 3 /** 4 * 文件監測器角色 5 */ 6 public interface FileMonitor { 7 8 /** 9 * 注冊觀察器 10 * @param observer 觀察器 11 */ 12 void addObserver(FileAlterationObserver observer); 13 14 /** 15 * 刪除觀察器 16 * @param observer 觀察器 17 */ 18 void removeObserver(FileAlterationObserver observer); 19 20 /** 21 * 獲取注冊的所有觀察器 22 * @return 觀察器集合 23 */ 24 Iterable<FileAlterationObserver> getObservers(); 25 26 /** 27 * 啟動監測器 28 */ 29 void start(); 30 31 /** 32 * 停止監測器 33 */ 34 void stop(); 35 36 /** 37 * 獲取監測間隔時間 38 * @return 間隔時間(單位:毫秒) 39 */ 40 long getInterval(); 41 42 } View Code
2. 實現類:FileMonitorImpl.class
五. 文件觀察器
1. 接口:FileObserver.class
1 import java.io.File; 2 3 import org.apache.commons.io.monitor.FileAlterationListener; 4 5 /** 6 * 文件觀察器角色 7 */ 8 public interface FileObserver { 9 10 /** 11 * 添加監聽器 12 * @param listener 13 */ 14 void addListener(final FileAlterationListener listener); 15 16 /** 17 * 刪除監聽器 18 * @param listener 19 */ 20 void removeListener(final FileAlterationListener listener); 21 22 /** 23 * 獲取注冊的監聽器 24 * @return 25 */ 26 Iterable<FileAlterationListener> getListeners(); 27 28 /** 29 * 初始化觀察器 30 * @throws Exception 31 */ 32 void initialize() throws Exception; 33 34 /** 35 * 銷毀觀察器 36 * @throws Exception 37 */ 38 void destroy() throws Exception; 39 40 /** 41 * 獲取觀察的目錄 42 * @return 43 */ 44 File getDirectory(); 45 46 /** 47 * 獲取文件過濾器 48 * 49 * @return 50 */ 51 public FileFilter getFilter(); 52 } View Code
2. 實現類:FileObserverImpl.class
1 import java.io.File; 2 import java.io.IOException; 3 4 import org.apache.commons.io.FileUtils; 5 import org.apache.commons.io.IOCase; 6 import org.apache.commons.io.monitor.FileAlterationListener; 7 import org.apache.commons.io.monitor.FileAlterationObserver; 8 9 /** 10 * 文件觀察器 11 * 12 * 當有文件創建、刪除、或變更動作時,則消息通知監聽器 13 */ 14 public class FileObserverImpl extends FileAlterationObserver implements FileObserver{ 15 16 private static final long serialVersionUID = -7239227289538993830L; 17 18 /** 19 * 文件過濾器 20 */ 21 private final FileFilter filter; 22 23 /** 24 * 設置要監聽觀察的目錄,並設置文件過濾器和監聽器,用以觀察指定具有指定擴展名的文件 25 * @param dir 觀察監聽的目錄 26 * @param filter 文件過濾器 27 * @param listener 文件監聽器 28 */ 29 public FileObserverImpl(String dir, final FileFilter filter, 30 FileAlterationListener listener) { 31 super(dir, filter, (IOCase) null); 32 addListener(listener); 33 34 this.filter = filter; 35 36 File directory = new File(dir); 37 38 // 如果目錄不存在 39 if(!directory.exists()) { 40 try { 41 FileUtils.forceMkdir(directory); 42 } 43 catch (IOException e) { 44 e.printStackTrace(); 45 } 46 } 47 // 如果存在的是文件 48 else if(directory.exists() && directory.isFile()) { 49 try { 50 FileUtils.forceDelete(directory); 51 FileUtils.forceMkdir(directory); 52 } 53 catch (IOException e) { 54 e.printStackTrace(); 55 } 56 } 57 } 58 59 /** 60 * 添加監聽器 61 */ 62 @Override 63 public void addListener(final FileAlterationListener listener) { 64 super.addListener(listener); 65 } 66 67 /** 68 * 移除監聽器 69 */ 70 @Override 71 public void removeListener(final FileAlterationListener listener) { 72 super.removeListener(listener); 73 } 74 75 /** 76 * 獲取觀察者對象的所有監聽器 77 */ 78 @Override 79 public Iterable<FileAlterationListener> getListeners() { 80 return super.getListeners(); 81 } 82 83 /** 84 * 初始化文件觀察者 85 */ 86 @Override 87 public void initialize() throws Exception { 88 super.initialize(); 89 } 90 91 /** 92 * 銷毀文件觀察者 93 */ 94 @Override 95 public void destroy() throws Exception { 96 super.destroy(); 97 } 98 99 /** 100 * 獲取所觀察的目錄 101 */ 102 @Override 103 public File getDirectory() { 104 return super.getDirectory(); 105 } 106 107 /** 108 * 獲取文件過濾器 109 * @return 110 */ 111 public FileFilter getFilter() { 112 return filter; 113 } 114 } View Code
六. 文件監聽器:FileListener.class
七. 文件過濾器
1. 接口:FileFilter.class
1 /** 2 * 文件過濾器角色,擴展自java.io.FileFilter 3 */ 4 public interface FileFilter extends java.io.FileFilter { 5 6 /** 7 * 獲取定義的擴展名 8 * 9 * @return 10 */ 11 String[] getExtensions(); 12 } View Code
2. 實現類:FileFilterImpl.class
1 import java.io.File; 2 3 import org.apache.commons.io.FilenameUtils; 4 5 /** 6 * 文件過濾器 7 */ 8 public class FileFilterImpl implements FileFilter{ 9 10 private String[] extensions; 11 12 public FileFilterImpl(String... extensions) { 13 this.extensions = extensions; 14 } 15 16 /** 17 * 是否接受該文件 18 */ 19 @Override 20 public boolean accept(File pathname) { 21 return FilenameUtils.isExtension(pathname.getName(), extensions); 22 } 23 24 /** 25 * 獲取定義的擴展名 26 * @return 27 */ 28 @Override 29 public String[] getExtensions() { 30 return extensions; 31 } 32 33 } View Code