这篇文章主要介绍了java 使用线程监控文件目录变化的实现方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
java 使用线程监控文件目录变化的实现方法
由于某种特殊的需求、弄了个使用线程监控文件目录变化的
代码基本如下、其中减去一些复杂的操作、只留下基本代码:
package com.file;
import java.io.file;
import java.util.arraylist;
import java.util.hashmap;
import java.util.iterator;
import java.util.list;
import java.util.map;
public class filesmonitor implements runnable {
// 文件夹路径
private string filepath = "d:\\t\\user\\local\\test\\";
// 存放已读文件<即:缓存目录>
private static map<string, file> map = new hashmap<string, file>();
@override
public void run() {
while (true) {
try {
// 设置每隔3秒检测一次
thread.sleep(3000);
filemonitor();
} catch (interruptedexception e) {
e.printstacktrace();
}
}
}
// 文件监听
public void filemonitor() {
file[] files = getfiles(filepath, null);
if (files != null && files.length > 0) {
// 如果缓存中文件与读取的个数不一样的时候
string fname = "";
if (files.length != map.size()) {
if (map.size() == 0) {
for (file file : files) {
fname = file.getname();
map.put(fname, file);
system.out.println("新增了文件:" + fname);
}
} else {
// 如果减少了文件
if (map.size() > files.length) {
list<string> removename = new arraylist<string>();
iterator<string> iter = map.keyset().iterator();
int j = 0;
while (iter.hasnext()) {
string key = iter.next();
if (key != null && key.length() > 0) {
for (file file : files) {
fname = file.getname();
if (fname.equals(key)) {
j = 1;
break;
}
}
if (j != 1) {
removename.add(key);
}
j = 0;
}
}
// 判断是否有删除的文件
if (removename.size() > 0) {
for (string item : removename) {
map.remove(item);
system.out.println("减少了文件:" + item);
}
}
} else {
for (file file : files) {
fname = file.getname();
if (!map.containskey(fname.trim())) {
map.put(fname, file);
system.out.println("新增了文件:" + fname);
}
}
}
}
} else {
map.clear();
for (file file : files) {
fname = file.getname();
map.put(fname, file);
}
}
system.out.println("此时缓存中文件个数:" + map.size());
}
}
/**
* 文件读取
*
* @param filepath
* 路径
* @param filename
* 名称
* @return 返回文件数组
*/
public file[] getfiles(string filepath, string filename) {
file[] files = null;
if (filename == null) {
file doc = new file(filepath);
if (doc.isdirectory()) {
string[] filenamearr = doc.list();
if (filenamearr.length > 0) {
files = new file[filenamearr.length];
for (int i = 0; i < filenamearr.length; i++) {
filename = filenamearr[i];
string fileabspath = filepath + filename;
file reginfofile = new file(fileabspath);
files[i] = reginfofile;
}
}
}
} else {
string path = filepath + filename;
file doc = new file(path);
if (doc.isfile()) {
files = new file[1];
files[0] = doc;
}
}
return files;
}
// 启动线程
public void show() {
filesmonitor t = new filesmonitor();
thread tread = new thread(t);
tread.setname("eshore");
tread.start();
}
// main测试
public static void main(string[] args) {
filesmonitor t = new filesmonitor();
t.show();
}
}
执行后,效果图如下:
以上就是java使用线程实现监控文件目录变化的方法的详细内容。