java 监听窗口是否改变_JAVA项目监听文件是否发生变化

一.spring容器都初始化完成之后做操作

packagecom.bijian.study.listener;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.ApplicationListener;importorg.springframework.context.event.ContextRefreshedEvent;importorg.springframework.web.context.support.XmlWebApplicationContext;importcom.bijian.monitor.FileMonitor;public class ContextFileListener implements ApplicationListener{

@AutowiredprivateFileMonitor fileMonitor;

@Overridepublic voidonApplicationEvent(ContextRefreshedEvent event) {if(event.getSource() instanceofXmlWebApplicationContext){if(((XmlWebApplicationContext)event.getSource()).getDisplayName().equals("Root WebApplicationContext")){try{

fileMonitor.monitor();

fileMonitor.start();

}catch(Exception e) {

e.printStackTrace();

}

}

}

}

}

二.applicationContext.xml添加配置

三.添加文件监听 FileMonitor、FileListener 可看资料commons-io-2.4

packagecom.bijian.study.monitor;importjava.io.File;importorg.apache.commons.io.monitor.FileAlterationListener;importorg.apache.commons.io.monitor.FileAlterationMonitor;importorg.apache.commons.io.monitor.FileAlterationObserver;public classFileMonitor {private FileAlterationMonitor monitor = null;privateString filePath;privateFileAlterationListener alterationListener;private long intervalTime = 10000L;public FileMonitor(long interval) throwsException {

monitor= newFileAlterationMonitor(interval);

}public FileMonitor() throwsException {

monitor= newFileAlterationMonitor(intervalTime);

}public voidmonitor(String path, FileAlterationListener listener) {

FileAlterationObserver observer= new FileAlterationObserver(newFile(path));

monitor.addObserver(observer);

observer.addListener(listener);

}public voidmonitor() {

FileAlterationObserver observer= new FileAlterationObserver(newFile(filePath));

monitor.addObserver(observer);

observer.addListener(alterationListener);

}public void stop() throwsException {

monitor.stop();

}public void start() throwsException {

monitor.start();

}publicString getFilePath() {returnfilePath;

}public voidsetFilePath(String filePath) {this.filePath =filePath;

}publicFileAlterationListener getAlterationListener() {returnalterationListener;

}public voidsetAlterationListener(FileAlterationListener alterationListener) {this.alterationListener =alterationListener;

}public longgetIntervalTime() {returnintervalTime;

}public void setIntervalTime(longintervalTime) {this.intervalTime =intervalTime;

}

}

packagecom.bijian.study.listener;importjava.io.File;importorg.apache.commons.io.monitor.FileAlterationListener;importorg.apache.commons.io.monitor.FileAlterationObserver;public class FileListener implementsFileAlterationListener {

@Overridepublic voidonStart(FileAlterationObserver observer) {//TODO Auto-generated method stub

System.out.println("onStart()");

}

@Overridepublic voidonDirectoryCreate(File directory) {//TODO Auto-generated method stub

System.out.println("onDirectoryCreate()");

}

@Overridepublic voidonDirectoryChange(File directory) {//TODO Auto-generated method stub

System.out.println("onDirectoryChange()");

}

@Overridepublic voidonDirectoryDelete(File directory) {//TODO Auto-generated method stub

System.out.println("onDirectoryDelete()");

}

@Overridepublic voidonFileCreate(File file) {//TODO Auto-generated method stub

System.out.println("onFileCreate()");

}

@Overridepublic voidonFileChange(File file) {//TODO Auto-generated method stub

System.out.println("onFileChange()");

}

@Overridepublic voidonFileDelete(File file) {//TODO Auto-generated method stub

System.out.println("onFileDelete()");

}

@Overridepublic voidonStop(FileAlterationObserver observer) {//TODO Auto-generated method stub

System.out.println("onStop()");

}

}

至此完成启动项目,在指定文件夹D:/SVN/下增加、修改、删除文件都会触发相关方法。

附:解决onApplicationEvent方法被执行两次以上的问题

原因:

在web 项目中(spring mvc),系统会存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)。在一个类里面实现了ApplicationListener接口,用于在初始化完成后做一些事情,但是Debug或输出日志,发现它执行了3次,其中一次是Spring 框架初始化时执行,另外两次是在项目启动成功后,加载Spring-MVC时执行的。

解决方法:

1.根据对象值来告诉定时器只执行一次

通过打 breakpoint看到,这两次执行中,onApplicationEvent(ContextRefreshdEvent event)方法中的 event对象值不同,第一次是 Root WebApplicationContext , 据此可以根据对象值来告诉定时器只执行一次即可,如如上实例所示,在这我System.out.println输出((XmlWebApplicationContext)event.getSource()).getDisplayName()。

packagecom.bijian.study.listener;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.ApplicationListener;importorg.springframework.context.event.ContextRefreshedEvent;importorg.springframework.web.context.support.XmlWebApplicationContext;importcom.bijian.study.monitor.FileMonitor;public class ContextFileListener implements ApplicationListener{

@AutowiredprivateFileMonitor fileMonitor;private static boolean isStart = false;

@Overridepublic voidonApplicationEvent(ContextRefreshedEvent event) {if(event.getSource() instanceofXmlWebApplicationContext){

System.out.println(((XmlWebApplicationContext)event.getSource()).getDisplayName());if(((XmlWebApplicationContext)event.getSource()).getDisplayName().equals("Root WebApplicationContext")){try{

fileMonitor.monitor();

fileMonitor.start();

}catch(Exception e) {

e.printStackTrace();

}

}

}

}

}

System.out.println(((XmlWebApplicationContext)event.getSource()).getDisplayName());输出的内容如下所示:

Root WebApplicationContext

WebApplicationContextfor namespace 'springMVC-servlet'WebApplicationContextfor namespace 'springMVC-servlet'

2.使用一个类变量isStart,控制只执行一次

packagecom.bijian.study.listener;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.context.ApplicationListener;

importorg.springframework.context.event.ContextRefreshedEvent;

importorg.springframework.web.context.support.XmlWebApplicationContext;

importcom.bijian.study.monitor.FileMonitor;

public class ContextFileListener implements ApplicationListener{

@Autowired

privateFileMonitor fileMonitor;

private static boolean isStart = false;

@Override

public voidonApplicationEvent(ContextRefreshedEvent event) {

if (!isStart) {

isStart = true;

try{

fileMonitor.monitor();

fileMonitor.start();

} catch(Exception e) {

e.printStackTrace();

}

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笨办法学python3 pdf 脚本之家_解决python3输入的坑——input()

如下所示:a,b,c,d input()很简单的代码,如果输入为1 -1 -2 3结果会报错,原因在于input函数会将你的输入作为python脚本运行,那么输入就变成了1-1 -2 3,即0 -2 3结果当然是错误的了,解决办法就是将输入用引…

java 数组写法_java书写、数据类型、数组定义

这里只记录java与php、javascript不同的地方,相同的地方就不赘述了。1.java文件源码为以.java为后缀的文件,字节码文件是以.class为后缀的文件。2.写好一个java源码之后,cmd进入源码文件盘符,用命令 javac helloworld.java将源码转…

python爬虫高级知识点_Python爬虫知识点梳理总结,殿堂级小白入门必读

数据分析是任何技术一样。你应该学习的目标。目标就像灯塔,指引你前进。我见过很多合作伙伴学习学习,然后学会放弃。事实上,很大一部分原因是没有明确的目标,所以你必须清楚学习的目的。你准备学习爬行之前,问问你自己为什么你想学爬行。有些人为了工作,一些为了好玩,和做一定黑…

java running_Running

/****/package test;import java.sql.ResultSet;import java.sql.SQLException;/*** author huangqin**/public class QuestString {private int curPage;//当前页数private int maxPage;//最大页数private int maxRowCount;//总记录数private int pageSize2;//每页显示的记录数…

python停用词表_多版本中文停用词词表 + 多版本英文停用词词表 + python词表合并程序...

文章简介与更新记录如果你只想获取中文停用词此表,请直接到文章结尾下载项目文件,其中包括三个中文停用词词表,一个英文停用词词表和一个合并词表的.py文件2017/07/04 创建文章,上传文件2017/07/04 更新了合并代码,添加了新的中文停用词表(哈工大扩展版本)和一个新的停用词表,现…

mysql collect_set_hive列转行 (collect_set())

一、问题hive如何将a b 1a b 2a b 3c d 4c d 5c d 6变为:a b 1,2,3c d 4,5,6二、数据test.txta b 1a b 2a b 3c d …

python编写递归函数和非递归函数、输出斐波那契数列_分别用非递归和递归的方法编写函数求斐波那契数列第n项。斐波那契数列1,1,2,3,5,8,13,…...

展开全部/**已知Fibonacci数列&#xff1a;1,1,2,3,5,8,……&#xff0c;F(1)1&#xff0c;F(2)1&#xff0c;F(n)F(n-1)F(n-2)*/#include #include typedef long long int int64;//方法1&#xff0c;递归法int64 Fibonacci(int n){int64 sum;if(n<0){printf("参数值e6…

python3.6安装ipython_centos6.5下安装python3.6、pip、ipython

一.先更换系统源为了下载顺畅一般都会更改为国内源。1 cd /etc/yum.repos.d/2 wget http://mirrors.163.com/.help/CentOS6-Base-163.repo #下载网易源3 mv CentOS-Base.repo CentOS-Base.repo.ori #备份源4 mv CentOS6-Base-163.repo CentOS-Base.repo #把网易源更改为默认源二…

java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码

wait()/notify()方法await()/signal()方法BlockingQueue阻塞队列方法PipedInputStream/PipedOutputStream阻塞队列的一个简单实现&#xff1a;public class BlockingQueue {private List queue new LinkedList();private int limit 10;public BlockingQueue(int limit){this…

python期末大作业_大一期末考试很重要,考得好不仅有机会有钱拿,还有机会换专业...

现阶段很多高校放寒假的时间已经公布&#xff0c;这也就意味着&#xff0c;大学期末考试即将到来。对于大一新生来说&#xff0c;大学的期末考试是比较新鲜的&#xff0c;因为大家都没有经历过。经历过大学考试的学生&#xff0c;都知道大学的大概学习模式&#xff0c;一般情况…

java http 302重定向_Java 纯HTTP请求 禁止302自动重定向

Java 纯HTTP Get请求获取响应内容&#xff0c;如果发生302重定向&#xff0c;继而模拟请求域获取重定向后的响应内容。关键点&#xff1a;设置conn.setInstanceFollowRedirects为false即可示例代码public static void main(String[] args) {try {StringBuffer buffer new Stri…

python 且_Pyface库:一个基于pyqt、pyside、wx且简化的python的GUI

1 说明&#xff1a;1.1 Pyface库由大名鼎鼎的enthought出品。1.2 介绍&#xff1a;1.2.1 英文&#xff1a;traits-capable windowing framework.The pyface project contains a toolkit-independent GUI abstraction layer, which is used to support the "visualization&…

java方法的参数类型_Java 基础 14 方法的重载 与 方法参数类型详解

1.1 方法重载的概述和特点方法重载概述在同一个类中&#xff0c;允许存在一个以上的同名方法&#xff0c;只要它们的参数个数或者参数类型不同即可。方法重载特点与返回值类型无关&#xff0c;只看方法名和参数列表在调用时&#xff0c;虚拟机通过参数列表的不同来区分同名方法…

crv仪表上的i是什么指示灯_汽车打不着火是怎么回事,仪表盘汽车发动机故障灯亮是什么情况故障指示灯图解大全集...

如果打不着火&#xff0c;那有可能是起动机坏了&#xff0c;有可能是电池没电了&#xff0c;有可能是电路出现了问题&#xff0c;还有可能是点火系统出现了问题。汽车发动机的点火系统主要部件是火花塞和点火线圈&#xff0c;火花塞是一个需要定期更换的易损件。如果火花塞长时…

python极简教程_Python 极简教程(六)运算符

运算符&#xff0c;我们日常生活中使用的加减乘除&#xff0c;都是运算符的一种。当然这种一般我们称为算术运算符&#xff0c;用于处理数字运算的。但是在计算机语言中&#xff0c;还有很多的运算符。用于处理不用的情况。主要有以下几类&#xff1a;算术运算符比较运算符逻辑…

python函数可变长参数_day14 Python函数之可变长参数

函数参数1.形参变量只有在被调用时才分配内存单元&#xff0c;在调用结束时&#xff0c;即刻释放所分配的内存单元。因此&#xff0c;形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量2.实参可以是常量、变量、表达式、函数等&#xff0c;无论实参是…

ubuntu 安装java jdk_「ubuntu安装jdk」Ubuntu安装jdk8的两种方式 - seo实验室

ubuntu安装jdk安装方式&#xff1a;1)&#xff1a;通过ppa(源) 方式安装.2)&#xff1a;通过官网安装包安装.JDK官网下载地址一&#xff1a;使用ppa(源)方式安装&#xff1a;1)&#xff1a;添加ppa源sudo add-apt-repository ppa:webupd8team/javasudo apt-get update2)&#x…

restful风格_什么是RESTful风格的API设计?

随着移动互联网的兴起&#xff0c;RESTful风格的API设计也随之流行起来&#xff0c;但我们说了那么多RESTful设计&#xff0c;它到底是什么&#xff1f;本篇文章带大家来了解一下它的真实面目。RESTful概念首先&#xff0c;我们需要明确的是RESTful&#xff0c;它是一个理念&am…

java jdbc 增删改封装_JAVA JDBC 常规增删改查简单封装

JAVA JDBC 常规增删改查简单封装,可满足大多基本要求作用&#xff1a;1&#xff0c; 查询列表是直接返回List对象&#xff0c;不必再遍历&#xff1b;2&#xff0c; 单条查询直接返回对象&#xff1b;3&#xff0c; 执行sql仅需一个方法搞定&#xff1b;package com.Main.Tools…

python wget安装_Macbook系统环境安装wget的2个方法 - 传统包及Homebrew安装

考虑到自身项目的拓展需要&#xff0c;朋友建议学习Python爬虫这样对于做大数据采集有较大的帮助&#xff0c;老蒋虽然每天也都接触一些脚本和程序的修改&#xff0c;但是并没有专业和系统的学习某一项编程。所以还是准备陆续的学习Python语言&#xff0c;无论有没有基础&#…