利用TimerTask,当web容器加载的时候初始化文件夹下的文件列表,赋给list1,当时钟进行第二次监听的时候在读出文件夹下的文件列表赋给list2,如果list2大于list1,则说明有新文件加入,然后通过文件的修改时间和web容器加载时的系统时间对比来判断是那个文件被添加进来了,从而完成了对文件夹的监听!具体代码如下:
PropertiesListener.java
/**
* 文件夹自动监听器
* @author litao
*
*/
public class PropertiesListener implements ServletContextListener {
/**
* 自动监听时钟
*/
private final Timer timer = new Timer();
/**
* 时钟间隔周期
*/
private final int sec = 1000*60;
/**
* 启动服务后多久开始进行监听
*/
private final int sec_start = 1000*30;
/**
* 监听文件夹所在地址
*/
private final String path = "D://test//";
public void contextInitialized(ServletContextEvent event) {
String status = "文件夹定时监听启动.";
event.getServletContext().log(status);
// 执行自动监听计划
timer.schedule(new PropertiesTask(path), sec_start, sec);
}
public void contextDestroyed(ServletContextEvent event) {
String status = "文件夹定时监听停止 .";
event.getServletContext().log(status);
// 停止自动监听时钟
timer.cancel();
}
}
PropertiesTask .java
/**
* 自动监听任务
*
* @author litao
*
*/
@SuppressWarnings("unchecked")
public class PropertiesTask extends TimerTask {
private String path;
private File files;
private String[] list1;
private long lastModified;
/**
* 构造一个自动更新任务
*
* @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();
}
/**
* 监听文件夹下的文件是否被更新。
*/
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("************所监听的文件夹路径- "+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>