【转载】java 监听文件或者文件夹变化的几种方式
1.log4j的实现的文件内容变化监听

- package com.jp.filemonitor;
- import org.apache.log4j.helpers.FileWatchdog;
- public class Log4jWatchdog {
- public static void main(String[] args) {
- GloablConfig gloablConfig = new GloablConfig("D:\\create_lo\\text.txt");
- gloablConfig.setDelay(10000);
- gloablConfig.start();
- while (true) {
- try {
- Thread.sleep(10000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- public static class GloablConfig extends FileWatchdog{
- protected GloablConfig(String filename) {
- super(filename);
- }
- @Override
- protected void doOnChange() {
- System.out.println(filename);
- }
- }
- }

2.common-io实现的文件夹变化的监听
这代码网上很多,可以搜索关键字FileAlterationMonitor,FileAlterationObserver FileAlterationObserver,这样就可以看到示例代码了。
Apacha common.io2.0提供了监听文件变化的功能。
功能由三个组件组成。
监听器 FileAlterationListener
用于实现文件改变时触发的行为。
观察者 FileAlterationObserver
用于观察文件的改变,通知注册的监听器执行相应的事件。
监视器 FileAlterationMonitor
通过一线程,每间隔一段时间调用一次注册的观察者检查文件。
maven依赖
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.4</version>
- </dependency>
FileAlterationListener
通过继承FileAlterationListenerAdaptor,覆盖相应事件方法。这里只重写了文件改变。还有其他事件可以查看FileAlterationListener接口看下。
- public class FileAlterationReload extends FileAlterationListenerAdaptor {
- @Override
- public void onFileChange(File file) {
- System.out.println("文件改变");
- }
- }
程序实现
- public class Demo {
- public static void main(String[] args) throws Exception {
- //检查classpath下properties文件夹下的properties文件。
- FileAlterationObserver fileAlterationObserver = new FileAlterationObserver(Demo.class.getClassLoader().getResource("properties").getPath(),new PropertiesFileFilter());
- FileAlterationListener fileAlterationListener =new FileAlterationReload();
- //注册监听器
- fileAlterationObserver.addListener(fileAlterationListener);
- FileAlterationMonitor fileAlterationMonitor = new FileAlterationMonitor();
- //注册观察者
- fileAlterationMonitor.addObserver(fileAlterationObserver);
- //启动监听
- fileAlterationMonitor.start();
- //让主线程别这么快结束。
- Thread.sleep(1000000);
- }
- }
修改properties文件夹下的properties文件时,会输出 文件改变。
应用场景
可以用于实现配置文件的热部署
例子:
https://github.com/wujiazhen2/DynamicConfigRefresh
3.nio实现文件夹内容变化的监听

- package com.jp.filemonitor;
- import java.io.IOException;
- import java.nio.file.FileSystems;
- import java.nio.file.Path;
- import java.nio.file.Paths;
- import java.nio.file.StandardWatchEventKinds;
- import java.nio.file.WatchEvent;
- import java.nio.file.WatchKey;
- import java.nio.file.WatchService;
- import java.util.List;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class ResourceListener {
- private static ExecutorService fixedThreadPool = Executors.newCachedThreadPool();
- private WatchService ws;
- private String listenerPath;
- private ResourceListener(String path) {
- try {
- ws = FileSystems.getDefault().newWatchService();
- this.listenerPath = path;
- start();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- private void start() {
- fixedThreadPool.execute(new Listner(ws,this.listenerPath));
- }
- public static void addListener(String path) throws IOException {
- ResourceListener resourceListener = new ResourceListener(path);
- Path p = Paths.get(path);
- p.register(resourceListener.ws,StandardWatchEventKinds.ENTRY_MODIFY,
- StandardWatchEventKinds.ENTRY_DELETE,
- StandardWatchEventKinds.ENTRY_CREATE);
- }
- public static void main(String[] args) throws IOException {
- ResourceListener.addListener("F:\\");
- ResourceListener.addListener("d:\\");
- }
- }
- class Listner implements Runnable {
- private WatchService service;
- private String rootPath;
- public Listner(WatchService service,String rootPath) {
- this.service = service;
- this.rootPath = rootPath;
- }
- public void run() {
- try {
- while(true){
- WatchKey watchKey = service.take();
- List<WatchEvent<?>> watchEvents = watchKey.pollEvents();
- for(WatchEvent<?> event : watchEvents){
- //TODO 根据事件类型采取不同的操作。。。。。。。
- System.out.println("["+rootPath+event.context()+"]文件发生了["+event.kind()+"]事件"+ event.count());
- }
- watchKey.reset();
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally{
- System.out.println("fdsfsdf");
- try {
- service.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }

【转载】java 监听文件或者文件夹变化的几种方式的更多相关文章
- java 监听文件或者文件夹变化的几种方式
1.log4j的实现的文件内容变化监听 package com.jp.filemonitor; import org.apache.log4j.helpers.FileWatchdog; public ...
- Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)
Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...
- java 监听文件或文件夹变化
今天遇到一个新需求,当从服务器下载文件后用指定的本地程序打开,不知道何时文件下载完成,只能考虑监听文件夹,当有新文件创建的时候打开指定程序. 在此给出一个完整的下载和打开过程: 1.下载文件 jsp页 ...
- Java监听模式
说明 生活中,监听无处不在.比如说,手机播放音乐功能,也是一种监听:你不点击播放按钮,手机就不放歌,当你点击时,手机就播放音乐.即触发某种行为,便执行相应的动作. 组成 Java监听模式右三个部分组成 ...
- java 监听控制台输入
分享一下我写的java监听控制台输入并可以给出响应的功能. 很多时候需要监听控制台的输入内容,相当于信号监听,根据输入的内容做出相应的动作,这里给出我的一个简单实现. 要注意的是:监听得到的消息中前后 ...
- iOS: 使用KVO监听控制器中数组的变化
一.介绍: KVO是一种能动态监听到属性值的改变的方式,使用场景非常广泛,这里我只讲如何监听控制器ViewController中数组的变化. 二.了解: 首先我们应该知道KVO是不能直接监听控制器Vi ...
- 使用 JavaScript 的 HTML 页面混合、JavaScript 文件引用和 HTML 代码嵌入 3 种方式在 HTML 页面上打印出“点击我进入到百度首页”的超链接
查看本章节 查看作业目录 需求说明: 使用 JavaScript 的 HTML 页面混合.JavaScript 文件引用和 HTML 代码嵌入 3 种方式在 HTML 页面上打印出"点击我进 ...
- Android监听系统短信数据库变化-提取短信内容
由于监听系统短信广播受到权限的限制,所以很多手机可能使用这种方式没法监听广播,从而没办法获取到系统短信,所以又重新开辟一条路. Android监听系统短信数据库内容变化使用场景: 1.监听短信数据库的 ...
- js监听输入框值的即时变化onpropertychange、oninput
js监听输入框值的即时变化onpropertychange.oninput 很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感. // // 要达到的效果 ...
随机推荐
- ELECTRON开发环境配置方法
1.下载并安装Node.js 下载地址:https://nodejs.org/en/download/current/ 安装之后进行验证 2.下载并这装electron 安装命令:npm instal ...
- XMPP基本内容简单介绍
即时通讯技术简单介绍 即时通讯技术(IM)支持用户在线实时交谈.假设要发送一条信息,用户须要打开一个小窗体,以便让用户及其朋友在当中输入信息并让交谈两方都看到交谈的内容.有很多的IM系统,如AOL I ...
- iOS分组通讯录效果+側滑菜单(MMDrawerController)
前言的废话-能够忽略 自从学会了使用Cocoapod,就欲罢不能了!由于太简单太赞了,不用再把源代码粘到project里了! 參见戴维营博客中的解说:Cocoapod 安装以及使用 先上一下效果图,请 ...
- 十分钟学会canvas
一句话描述:canvas是HTML5加入的用来绘制2D图像与文字的元素. 基础 简单步骤: var c = document.getElementById("mycanvas"); ...
- C++著名程序库的比较
转载出处:http://www.acejoy.com/ace/thread-3777-1-1.html 1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost3. ...
- 君正Ingenic X1000E_halley2 更改Logo
有两种方法可以改变开机logo,编译进内核或者修改u-boot. <一>.编译进内核 一. 制作LOGO图片(可以使用gimp) 1. 制作一个.ppm格式图片(logo_tvu_clut ...
- oc30--id
// // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject - (void)sleep; @ ...
- hihocoder 1677 翻转字符串 splay
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串S,小Hi希望对S进行K次翻转操作. 每次翻转小Hi会指定两个整数Li和Ri,表示要将S[Li..Ri]进行 ...
- 【WIP】Rails devise导入与使用方法
创建: 2017/09/07 更新: 2017/10/14 标题加上[WIP] 源代码: https://github.com/plataformatec/devise 命令行内容总结 安 ...
- [Apple开发者帐户帮助]五、管理标识符(5)创建一个iCloud容器
您必须拥有一个或多个iCloud容器才能启用iCloud. 所需角色:帐户持有人或管理员. 在“ 证书”,“标识符和配置文件”中,从左侧的弹出菜单中选择操作系统. 在“标识符”下,选择“iCloud容 ...