Java 线程学习———目录文件监控

目录监控

功能描述

监控某个目录,当目录下有新文件产生时,在控制台输出文件的信息,当目录的第一级子目录中的标准文件被修改时,在控制台输出被修改的文件的修改时间。

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();
	}
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值