【发布时间】:2011-06-08 01:25:46
【问题描述】:
我的程序(服务器)有一个记录器,它是主服务器类的一个属性,所有其他类都使用它来记录错误。有没有办法在程序终止时删除 .lck 文件?我的代码:
private static Logger log = Logger.getLogger("ServerLog");
public Server() {
// initialize variables
try {
FileHandler fh = new FileHandler(
"src/main/resources/log/ServerLog.log", true);
log.addHandler(fh);
log.setLevel(Level.ALL);
fh.setFormatter(new SimpleFormatter());
} catch (SecurityException e) {
getLog().log(Level.WARNING, e.getMessage());
} catch (IOException e) {
getLog().log(Level.WARNING, e.getMessage());
}
}
它被其他类调用来记录错误。
第二个问题:当我写一个文件时:
public final void saveRanking() {
try {
FileOutputStream fos = new FileOutputStream(
"src/main/resources/database/dataRanking.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(getRanking());
oos.flush();
oos.close();
fos.close();
} catch (FileNotFoundException e) {
getLog().log(Level.SEVERE, e.getMessage());
} catch (IOException e) {
getLog().log(Level.SEVERE, e.getMessage());
}
}
有没有办法确保即使在写入过程中进程终止,文件也可以毫无问题地保存?
【问题讨论】:
-
我不确定我是否理解创建 .lck 的原因。
-
关于 *nix 的一个提示,目录创建是一个原子过程(即 inode 要么存在,要么不存在,普遍)所以你使用锁目录而不是锁文件,因为它是安全一点。要回答(其中一个)您的问题:让您的 Logger 类可关闭并将其关闭在程序退出时始终调用的某个位置,例如 main 方法中的 finally 块。没有办法确保程序中的任何内容,我们尝试,我们捕捉,然后我们最终确定。叹息。
-
不要在一个问题中问两个不相关的问题。我建议您编辑问题以删除第二个问题...并为其创建一个新问题。