【问题标题】:Java: delete .lck files and ensure file writingJava:删除 .lck 文件并确保文件写入
【发布时间】: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 块。没有办法确保程序中的任何内容,我们尝试,我们捕捉,然后我们最终确定。叹息。
  • 不要在一个问题中问两个不相关的问题。我建议您编辑问题以删除第二个问题...并为其创建一个新问题。

标签: java file logging


【解决方案1】:

如果您的代码在关闭时删除 FileHandler,请务必在删除后关闭 FileHandler。当 FileHandler 打开时,您应该会看到锁定文件。如果您在 VM 退出后看到它们仍然存在,那是因为 FileHandler 未关闭,VM 在处理程序关闭挂钩运行时停止或崩溃,或者在尝试删除它们时发生 I/O 异常。

您可能会遇到JDK-6774110 lock file is not deleted when child logger is used. 对此没有评估,但我认为当记录器被垃圾收集时可能会发生这种情况。见JDK-6274920: JDK logger holds strong reference to java.util.logging.Logger instances.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多