我想在线程完成或强制完成后关闭所有FileHandler
我创建了一个closeLogger
函数,但它似乎没有被称为
因为我看到文件仍然锁定在文件夹中。
我的代码如下:
public class Passenger extends Thread {
private Logger logger;
public Passenger() throws SecurityException, IOException, InterruptedException {
logger = Logger.getLogger(String.format("Passenger%sLogger", name));
FileHandler fileHandler = new FileHandler(String.format(".\\Logs\\PassengerLogs\\passenger_%s.txt", name), true);
fileHandler.setFormatter(new LogFormatter());
logger.addHandler(fileHandler);
}
@Override
public void run() {
try {
goToStation();
waitForTaxi();
if (passengerState == PassengerState.WatingInQueue) {
goHome();
} else { // already in taxi
synchronized (this) {
wait();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
closeLogger();
}
}
private void closeLogger() {
Logger logger = getLogger();
java.util.logging.Handler[] handlers = logger.getHandlers();
for (java.util.logging.Handler h : handlers) {
try {
h.close();
} catch (SecurityException e) {}
}
}
}
答案 0 :(得分:2)
由于你是使用addHandler()添加处理程序,所以clean方法是close()然后调用removeHandler()
另外,从上面链接复制:
通过这个初始(便宜)测试后,Logger将分配一个 LogRecord描述日志消息。然后它将调用过滤器 (如果有的话)对记录是否应该进行更详细的检查 出版。如果通过它将然后将LogRecord发布到它 输出处理程序。 默认情况下,记录器也会发布到其父级 处理程序,递归树上。
因此,如果您不删除处理程序,它仍将保留引用。这可能是您的文件仍然被锁定的原因。试试这个,让我知道它是否有效!