首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java 监听资料内容变化

2012-08-22 
java 监听文件内容变化????? 有时候,我们需要确定某些文件是否有变化而做出一些对应的动作,例如,曾经开发

java 监听文件内容变化

????? 有时候,我们需要确定某些文件是否有变化而做出一些对应的动作,例如,曾经开发的一款服务器中,由于模块比较多,在运行期间有时候需要单独的输出某个模块日志,但又不可能总是开着日志。

????

????? log4j中已经实现了可以动态监控日志级别日志监视器

?

PropertyConfigurator.configureAndWatch(properties);

?

????? 上面的properties是日志配置文件,例如常用的 log4j.properties ,log4j.xml。

?

? 但是这是系统级别的,然后看了一下源代码,

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */// Contributors:  Mathias Bogaertpackage org.apache.log4j.helpers;import java.io.File;/** * Check every now and then that a certain file has not changed. If it has, then * call the {@link #doOnChange} method. *  * @author Ceki Gülcü * @since version 0.9.1 */public abstract class FileWatchdog extends Thread {/** * The default delay between every file modification check, set to 60 * seconds. */static final public long DEFAULT_DELAY = 60000;/** * The name of the file to observe for changes. */protected String filename;/** * The delay to observe between every check. By default set * {@link #DEFAULT_DELAY}. */protected long delay = DEFAULT_DELAY;File file;long lastModif = 0;boolean warnedAlready = false;boolean interrupted = false;protected FileWatchdog(String filename) {super("FileWatchdog");this.filename = filename;file = new File(filename);setDaemon(true);checkAndConfigure();}/** * Set the delay to observe between each check of the file changes. */public void setDelay(long delay) {this.delay = delay;}abstract protected void doOnChange();protected void checkAndConfigure() {boolean fileExists;try {fileExists = file.exists();} catch (SecurityException e) {LogLog.warn("Was not allowed to read check file existance, file:["+ filename + "].");interrupted = true; // there is no point in continuingreturn;}if (fileExists) {long l = file.lastModified(); // this can also throw a// SecurityExceptionif (l > lastModif) { // however, if we reached this point thislastModif = l; // is very unlikely.doOnChange();warnedAlready = false;}} else {if (!warnedAlready) {LogLog.debug("[" + filename + "] does not exist.");warnedAlready = true;}}}public void run() {while (!interrupted) {try {Thread.sleep(delay);} catch (InterruptedException e) {// no interruption expected}checkAndConfigure();}}}

?

? 这是一个抽象类,子类只要实现最关心的文件内容有变化的回调方法 doOnChange 就OK。

?

? 因此,在一个工程中,如果想实现模块级别的日志控制,则我们可以附件一个配置文件,在这个配置文件中指定模块的日志级别, 在log4j中指定总的级别,然后在应用中实现文件内容监控,则可以做到动态切换,实现细粒度的控制。

?

?

热点排行