Java:删除.lck文件并确保文件写入

标签 java file logging

我的程序(服务器)有一个记录器,它是主服务器类的一个属性,所有其他类都使用它来记录错误。有没有办法在程序终止时删除 .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());
    }
}

有没有办法保证即使进程在写入过程中终止,文件保存也不会出现问题?

最佳答案

如果您的代码在关闭时删除 FileHandler,请务必在删除后关闭 FileHandler。当 FileHandler 打开时,您应该会看到锁定文件。如果您看到它们在 VM 退出后徘徊,那么这是因为 FileHandler 未关闭,VM 在处理程序关闭 Hook 运行时停止或崩溃,或者在尝试删除它们时发生 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.

关于Java:删除.lck文件并确保文件写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6273314/

相关文章:

linux - 如何使用 Logrotate 保留 14 天的日志?

java - 在端口 80 上设置 tomcat 后,PhpMyAdmin 无法访问

java - 如何使用扫描仪从文本文件创建数组?

java - Android:转换为 Dalvik 格式失败:无法执行 dex:null

java - 在java中不使用循环读取完整文件

git - Git 存储库中文件的唯一标识符

java - Java 中的原始 HTTP 1.1 请求实现未终止

C++ - 读取文件字符时无限循环

delphi - FastMM4,如何读取日志文件?

unix - 如何跟踪文件夹和子文件夹内的所有日志文件?