这篇文章主要介绍了Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)实现文件监控器文件监视器的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
应用场景:
代码可以实现文件变化后的监听,如文件变化,自动重新加载文件内容,实现配置文件的热部署。
代码:
包com。yx。演示。文件监视器;
导入Java。io。文件;
导入Java。郎。参考文献。弱引用;
导入Java。util。ArrayList
导入Java。util。收藏;
导入Java。util。hashmap
导入Java。util。迭代器;
导入Java。util。列表;
导入Java。util。计时器;
导入Java。util。timertask
/**
*文件监视器
* 文件监控器
*
* @作者yx
* @日期2019/12/21 0:59
*/
公共类文件监视器{
/**
* 每2秒更新的默认监控器
*/
私有静态文件监视器默认文件监视器=新文件监视器(2 * 1000);
私人计时器timer _;
private HashMapFile,文件入口files _;//文件长度
private ListFileEntry fileEntrys=new Java。util。并发。copyonwritearraylistfileentry();
private CollectionWeakReferenceFileListener listeners _;//of WeakReference(FileListener)
私有长轮询间隔=10000
公共静态文件监视器getDefaultFileMonitor() {
返回defaultFileMonitor
}
/**
*创建具有指定轮询间隔的文件监视器实例。
*
* @param pollingInterval轮询间隔,以毫秒为单位。
*/
公共文件监视器(长轮询间隔){
这个。轮询间隔=轮询间隔;
files_=new HashMapFile,file entry();
listeners _=new ArrayListWeakReferenceFileListener();
计时器_=新计时器(' FileMonitor ',true);
计时器_ .schedule(new FileMonitorNotifier(),0,轮询间隔);
}
/**
*停止文件监视器轮询。
*/
公共无效站点(){
计时器_ .cancel();
定时器_=空
}
public void start() {
if (timer_==null) {
计时器_=新计时器(真);
计时器_ .schedule(new FileMonitorNotifier(),0,轮询间隔);
}
}
/**
*添加要监听的文件。文件可以是任何java.io.File(包括
*目录)中,并且很可能是一个不存在的文件
*文件的创建将被中断。
* p
*可以监听多个文件。当指定的文件为
*创建、修改或删除时,监听器会得到通知。
*
* @param文件要监听的文件。
*/
公共void addFile(字符串id,文件文件){
如果(!文件_。包含密钥(文件)){
FileEntry entry=new FileEntry(id,file,file.exists()?文件。last modified():-1);
文件_。放(文件,条目);
}
}
/**
* 添加监控文件实体。
*
* @param fileEntry
*/
公共void addfile条目(文件条目file条目){
如果(!文件入口。包含(文件条目)){
文件入口。添加(文件条目);
}
}
/**
* 通过文件实体的标识判断监控文件实体是否存在。
*
* @param id
* @返回
*/
公共布尔文件入口存在(字符串id) {
if (id==null) {
返回错误的
}
for(int I=0;我提交了申请。size();i ) {
if (id.equals(fileEntrys.get(i)).getId())) {
返回真实的
}
}
返回错误的
}
/**
* 通过文件实体标识删除一个监控文件实体。
*
* @param id
*/
公共void removeFileEntry(字符串id) {
if (id==null) {
返回;
}
for(int I=0;我提交了申请。size();i ) {
if (id.equals(fileEntrys.get(i)).getId())) {
文件入口。删除;
返回;
}
}
}
/**
*删除指定的监听文件。
*
* @param文件要删除的文件。
*/
公共void删除文件(文件File){
文件_。删除(文件);
}
/**
*将侦听器添加到此文件监视器。
*
* @param fileListener要添加的侦听器。
*/
public void addListener(文件侦听器文件侦听器){
//如果已经存在,就不要添加
for(IteratorWeakReferenceFileListener I=listeners _ .迭代器();I .有next();) {
WeakReferenceFileListener reference=I . next();
文件监听器监听器=(文件监听器)引用。get();
if (listener==fileListener) {
返回;
}
}
//使用弱引用避免内存泄漏,如果这成为
//对象的唯一引用。
听众_。add(新WeakReferenceFileListener(文件侦听器));
}
/**
*从此文件监视器中删除侦听器。
*
* @param fileListener要删除的侦听器。
*/
公共void删除侦听器(文件侦听器文件侦听器){
for(IteratorWeakReferenceFileListener I=listeners _ .迭代器();I .有next();) {
WeakReferenceFileListener reference=(WeakReferenceFileListener)I . next();
文件监听器监听器=(文件监听器)引用。get();
if (listener==fileListener) {
I . remove();
打破;
}
}
}
/**
*这是每n毫秒执行一次的计时器线程,根据
*对文件监视器的设置。它会调查有问题的文件
*并在发生变化时通知监听器。
*/
私有类文件监控通知程序扩展TimerTask {
@覆盖
公共无效运行(){
尝试{
for(迭代器文件入口I=文件入口。迭代器();I .有next();) {
尝试{
文件入口entry=I . next();
if (entry==null ||!entry.check()) {
I . remove();
}
} catch (Throwable t) {
t。printstacktrace();
System.out.println('执行文件监控发生错误:' t . getmessage());
}
}
//对注册的文件进行循环,查看哪些文件发生了更改。
//使用列表的副本,以防侦听器想要更改
//在其文件已更改方法中列出。
集合文件files=new ArrayList file(files _ .keySet());
for(迭代器文件I=文件。迭代器();I .有next();) {
file file=I . next();
尝试{
FileEntry fileEntry=files_ .获取(文件);
long lastModifiedTime=文件条目。getlastmedified();
长新修改时间=文件。存在()?文件。last modified():-1;
//记录器。调试(文件。getabsolutepath());
//logger.debug(' {}={} ',lastModifiedTime,newModifiedTime);
//检查文件是否已更改
if (newModifiedTime!=lastModifiedTime) {
//logger.debug('file changed {})',file。getabsolutepath());
文件入口。setlastmedified(新的修改时间);
//注册新的修改时间
文件_。put(文件,文件入口);
if (fileEntry.getFileListener()!=null) {
getFileListener().文件已更改(文件条目);
}否则{
//通知侦听器
for(IteratorWeakReferenceFileListener j=
听众_。迭代器();j .有next();) {
WeakReferenceFileListener引用=
(WeakReferenceFileListener)j . next();
文件监听器监听器=(文件监听器)引用。get();
//如果后端对象已被GC'd,则从列表中移除
if (listener==null) {
j。移除();
}否则{
听众。文件已更改(文件条目);
}
}
}
}
} catch (Throwable t) {
如果(文件!=null) {
t。printstacktrace();
System.out.println(
文件监视器执行错误,file=' file.getAbsolutePath()
t。getmessage());
}否则{
System.out.println(
文件监视器执行错误,file=null ' t . getmessage());
}
}
}
} catch (Throwable t) {
System.out.println('执行文件监控发生错误t . getmessage());
}
}
}
}
包com。yx。演示。文件监视器;
/**
*文件监听器
*
* @作者yx
* @日期2019/12/21 0:55
*/
公共接口FileListener {
/**
*
* @param fileEntry
*/
公共void文件已更改(文件条目文件条目);
}
包com。yx。演示。文件监视器;
导入Java。io。文件;
导入Java。郎。参考文献。弱引用;
/**
*文件条目
* 文件条目,如果文件入口指定了文件监听器,那么当文件发生变动时只触发指定的文件监听器
*
* @作者yx
* @日期2019/12/21 0:56
*/
公共类文件条目{
字符串id;
文件文件;
长lastModified
文件监听程序文件监听程序=空
对象用户数据
WeakReferenceObject引用=空
/**
* 构造函数。
*
* @param id
* @param文件
*/
公共文件条目(字符串id,文件文件){
this(id,file,file.exists()?文件。last modified():-1);
}
公共文件条目(对象引用、字符串身份证,文件文件){
this(id,file,file.exists()?文件。last modified():-1);
reference=new WeakReferenceObject(reference);
}
/**
* 构造函数。
*
* @param id标识
* @param文件要监控的文件
* @param lastmodified最后修改日期
*/
公共文件条目(字符串id,文件文件,long lastmodified) {
super();
this.id=id
this.file=file
这个。上次修改=上次修改;
}
公共布尔校验(){
如果(参考!=null reference.get()==null) {
//监控对象已经不存在,请求文件监视器删除自己
返回错误的
}
长新修改时间=文件。存在()?文件。last modified():-1;
if (lastModified!=newModifiedTime) {
这个。上次修改时间=新的修改时间;
文件侦听器ls=this。getfile listener();
if (ls==null) {
返回错误的
}否则{
尝试{
ls。文件已更改(this);
} catch(异常e) {
e。printstacktrace();
System.err.println('执行文件监控事件监听e . getmessage());
}
返回真实的
}
}否则{
返回真实的
}
}
公共字符串getId() {
返回id;
}
公共void集合id(字符串id) {
this.id=id
}
公共文件getFile() {
返回文件;
}
公共void setFile(文件文件){
this.file=file
}
public long getlastmedified(){
返回上次修改时间
}
public void setlastmedified(long lastmedified){
这个。上次修改=上次修改;
}
公共FileListener getFileListener() {
返回文件监听器
}
public void setfile listener(文件侦听器文件侦听器){
这个。文件监听器=文件监听器;
}
公共对象getUserData() {
返回用户数据;
}
公共空集用户数据(对象用户数据){
这个。用户数据=用户数据;
}
}
使用演示:
//文件路径
字符串fileName=' conf/database。XML ';
//文件监控
文件监听器文件监听器=新文件监听器(){
@覆盖
公共无效文件已更改(文件条目文件条目){
//TODO文件变化后的业务处理
}
};
文件文件=新文件(文件名);
文件条目file entry=新文件条目('数据库',文件);
//设置文件监控
文件入口。setfile listener(文件监听器);
文件监视器。getdefaultfilemonitor().addFileEntry(文件入口);
总结
以上所述是小编给大家介绍的Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)实现文件监控器文件监视器的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。