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 Bogaert
package 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 continuing
return;
}
if (fileExists) {
long l = file.lastModified(); // this can also throw a
// SecurityException
if (l > lastModif) { // however, if we reached this point this
lastModif = 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中指定總的級別,然后在應用中實現文件內容監控,則可以做到動態切換,實現細粒度的控制。
總結
以上是生活随笔為你收集整理的java 监听文件内容_java 监听文件内容变化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sae 本地环境 mysql数据库_SA
- 下一篇: java locale.us_JAVA实