欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java 使用线程监控文件目录变化的实现方法

程序员文章站 2024-02-23 09:13:10
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 使用线程监控文件目录变化的实现方法

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!