利用TimerTask,當(dāng)web容器加載的時候初始化文件夾下的文件列表,賦給list1,當(dāng)時鐘進行第二次監(jiān)聽的時候在讀出文件夾下的文件列表賦給list2,如果list2大于list1,則說明有新文件加入,然后通過文件的修改時間和web容器加載時的系統(tǒng)時間對比來判斷是那個文件被添加進來了,從而完成了對文件夾的監(jiān)聽!具體代碼如下:
PropertiesListener.java
/**
* 文件夾自動監(jiān)聽器
* @author litao
*
*/
public class PropertiesListener implements ServletContextListener {
/**
* 自動監(jiān)聽時鐘
*/
private final Timer timer = new Timer();
/**
* 時鐘間隔周期
*/
private final int sec = 1000*60;
/**
* 啟動服務(wù)后多久開始進行監(jiān)聽
*/
private final int sec_start = 1000*30;
/**
* 監(jiān)聽文件夾所在地址
*/
private final String path = "D:\\test\\";
public void contextInitialized(ServletContextEvent event) {
String status = "文件夾定時監(jiān)聽啟動.";
event.getServletContext().log(status);
// 執(zhí)行自動監(jiān)聽計劃
timer.schedule(new PropertiesTask(path), sec_start, sec);
}
public void contextDestroyed(ServletContextEvent event) {
String status = "文件夾定時監(jiān)聽停止 .";
event.getServletContext().log(status);
// 停止自動監(jiān)聽時鐘
timer.cancel();
}
}
PropertiesTask .java
/**
* 自動監(jiān)聽任務(wù)
*
* @author litao
*
*/
@SuppressWarnings("unchecked")
public class PropertiesTask extends TimerTask {
private String path;
private File files;
private String[] list1;
private long lastModified;
/**
* 構(gòu)造一個自動更新任務(wù)
*
* @param context
*/
public PropertiesTask(String path) {
this.path = path;
this.lastModified = System.currentTimeMillis();
this.files = new File(path);
if (files.isDirectory()) {
this.list1 = files.list();
}
}
public void run() {
todo();
}
/**
* 監(jiān)聽文件夾下的文件是否被更新。
*/
private void todo() {
if (files.isDirectory()) {
String[] list2 = files.list();
if (list1.length < list2.length) {
for (int i = 0; i < list2.length; i++) {
File file = new File(path + list2[i]);
while (isFileUpdated(file)) {
System.out.println(list2[i]+" 文件被更新");
break;
}
}
list1 = files.list();
} else {
list1 = files.list();
}
}else{
System.out.println("************所監(jiān)聽的文件夾路徑- "+path+" -不存在***********");
}
}
/**
* 判斷物理文件是否已被更新
*
* @param filename
* 物理文件名
* @return 是
JAVA TimerTask之監(jiān)聽文件夾
2009-11-03 10:36
利用TimerTask,當(dāng)web容器加載的時候初始化文件夾下的文件列表,賦給list1,當(dāng)時鐘進行第二次監(jiān)聽的時候在讀出文件夾下的文件列表賦給list2,如果list2大于list1,則說明有新文件加入,然后通過文件的修改時間和web容器加載時的系統(tǒng)時間對比來判斷是那個文件被添加進來了,從而完成了對文件夾的監(jiān)聽!具體代碼如下: PropertiesListener.java /** * 文件夾自動監(jiān)聽器 * @author litao * */ public class PropertiesListener implements ServletContextListener { /** * 自動監(jiān)聽時鐘 */ private final Timer timer = new Timer(); /** * 時鐘間隔周期 */ private final int sec = 1000*60; /** * 啟動服務(wù)后多久開始進行監(jiān)聽 */ private final int sec_start = 1000*30; /** * 監(jiān)聽文件夾所在地址 */ private final String path = "D:\\test\\"; public void contextInitialized(ServletContextEvent event) { String status = "文件夾定時監(jiān)聽啟動."; event.getServletContext().log(status); // 執(zhí)行自動監(jiān)聽計劃 timer.schedule(new PropertiesTask(path), sec_start, sec); } public void contextDestroyed(ServletContextEvent event) { String status = "文件夾定時監(jiān)聽停止 ."; event.getServletContext().log(status); // 停止自動監(jiān)聽時鐘 timer.cancel(); } } PropertiesTask .java /** * 自動監(jiān)聽任務(wù) * * @author litao * */ @SuppressWarnings("unchecked") public class PropertiesTask extends TimerTask { private String path; private File files; private String[] list1; private long lastModified; /** * 構(gòu)造一個自動更新任務(wù) * * @param context */ public PropertiesTask(String path) { this.path = path; this.lastModified = System.currentTimeMillis(); this.files = new File(path); if (files.isDirectory()) { this.list1 = files.list(); } } public void run() { todo(); } /** * 監(jiān)聽文件夾下的文件是否被更新。 */ private void todo() { if (files.isDirectory()) { String[] list2 = files.list(); if (list1.length < list2.length) { for (int i = 0; i < list2.length; i++) { File file = new File(path + list2[i]); while (isFileUpdated(file)) { System.out.println(list2[i]+" 文件被更新"); break; } } list1 = files.list(); } else { list1 = files.list(); } }else{ System.out.println("************所監(jiān)聽的文件夾路徑- "+path+" -不存在***********"); } } /** * 判斷物理文件是否已被更新 * * @param filename * 物理文件名 * @return 是 true 否 false */ private boolean isFileUpdated(File file) { if (file.isFile()) { long lastUpdateTime = file.lastModified(); if (lastUpdateTime > this.lastModified) { this.lastModified = lastUpdateTime; return true; } else { return false; } } else { return false; } } } web.xml配置 <listener> <listener-class>com.PropertiesListener</listener-class> </listener> |
true 否 false
*/
private boolean isFileUpdated(File file) {
if (file.isFile()) {
long lastUpdateTime = file.lastModified();
if (lastUpdateTime > this.lastModified) {
this.lastModified = lastUpdateTime;
return true;
} else {
return false;
}
} else {
return false;
}
}
}
web.xml配置
<listener>
<listener-class>com.PropertiesListener</listener-class>
</listener>