目录监控
功能描述
监控某个目录,当目录下有新文件产生时,在控制台输出文件的信息,当目录的第一级子目录中的标准文件被修改时,在控制台输出被修改的文件的修改时间。
FileListener类——文件监控线程
此线程主要用于监控文件(仅限标准文件)是否发生改变(通过文件的最后修改时间来判断)。
/**
* 监控文件是否发生改变
*
* @author 小锋
*
*/
public class FileListener extends Thread {
private File file;
/** 记录文件最后的修改时间 */
private long lastModify;
public FileListener(File file) {
super();
this.file = file;
}
@Override
public void run() {
lastModify = file.lastModified();
System.out.println("开始监控:" +file.getName()+"\t"+ LocalDateTime.now());
while (true) {
// 不断获取最后修改时间
long newtime = file.lastModified();
if (newtime != lastModify) {
System.out.println("文件"+file.getName()+"被修改,修改时间:" + Tools.getFmtTime(newtime));
// 更新最后修改时间
lastModify = newtime;
}
try {
//设置休眠三秒,每隔三秒检查一次
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
DirListener类——目录监控线程
该类主要用于监听目录中是否有新文件产生(仅限第一级子目录)。
/**
* 监控某个目录的一级目录中是否有文件产生
*
* @author 小锋
*
*/
public class DirListener extends Thread {
/** 需要监控的目录,通过构造器传入 */
private File dir;
/** 目录中子文件集合 */
private File[] files;
public DirListener(File dir) {
super();
this.dir = dir;
}
@Override
public void run() {
// 获取所有子文件对象
files = dir.listFiles();
for (File file : files) {
// 监控目录中文件是否发生修改
new FileListener(file).start();
}
System.out.println("开始监控目录:" + LocalDateTime.now());
while (true) {
// 获取当前所有子文件集合
File[] newfiles = dir.listFiles();
if (files.length != newfiles.length) {
// 判断是否有新增文件
for (File f : newfiles) {
// 定义文件标识,默认为新文件
boolean flag = true;
for (File f2 : files) {
if (f.getName().equals(f2.getName())) {
//如果集合中有同名的文件,证明该文件不是新文件
flag = false;
}
}
// 如果flag为true,则该文件为新文件
if (flag) {
System.out.println("新文件产生:" + f.getName() + " " + Tools.getFmtTime(f.lastModified()));
// 监控新增文件
new FileListener(f).start();
}
}
// 更新集合
files = newfiles;
}
try {
// 设置休眠三秒,每隔三秒检查一次
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Tools类——工具类
将毫秒数格式化为特定的字符串。
/**
* 工具类
*
* @author 小锋
*
*/
public class Tools {
/**
* 对提供的毫秒数表示的时间格式化为特定的字符串
* @param time
* @return
*/
public static String getFmtTime(long time) {
Date date = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
return sdf.format(date);
}
}
Enter类——程序入口
public class Enter {
public static void main(String[] args) {
//用于测试文件监控
// File file = new File("D:/record.txt");
// 创建并启动文件监控进程
// new FileListener(file).start();
File dir = new File("D:/111");//括号中放入需要监控的目录绝对路径
// 创建并启动目录监控进程
new DirListener(dir).start();
}
}