FileHandler 创建会导致 NoSuchFileException 导致缺少 .lck

Posted

技术标签:

【中文标题】FileHandler 创建会导致 NoSuchFileException 导致缺少 .lck【英文标题】:FileHandler creation gives NoSuchFileException cause missing .lck 【发布时间】:2020-10-31 05:23:01 【问题描述】:

我现在正在寻找 2 小时的解决方案:

我正在尝试将 FileHandler 添加到 JAR 中的 Logger 中。日志目录在外面。

在我的 IDE (NetBeans) 中这是可行的:

public static void addFileHandler(Logger logger) 
        try 
            Path p = Paths.get("logs", logger.getName().substring(logger.getName().lastIndexOf('.') + 1) + ".log");
            FileHandler fh = new FileHandler(p.toString(), false);
            fh.setFormatter(sf);
            fh.setLevel(Level.ALL);
            fh.setEncoding("UTF-8");
            logger.addHandler(fh);
            if (errorHandler != null) 
                logger.addHandler(errorHandler);
            
            if (allHandler != null) 
                logger.addHandler(allHandler);
            
         catch (IOException | SecurityException ex) 
            LOG.log(Level.SEVERE, getString("ERROR WHILE ADDING FILEHANDLER TO LOGGER") + " " + logger.getName(), ex);
            return;
        
        LOG.log(Level.INFO, getString("LOGGER 0 GOT ADDED HIS FILEHANDLERS SUCCESSFULLY") + "!", logger.getName());
    

但在我的 Jar 中,我不断为每个 Logger 获取这个:

Juli 10, 2020 2:36:48 PM de.dhbw.mosbach.inf19b.programmieren2.game.utilities.logging.Logging addFileHandler
SEVERE: Fehler beim Hinzufügen vom FileHandler zum Logger de.dhbw.mosbach.inf19b.programmieren2.game.utilities.logging.Formatting
java.nio.file.NoSuchFileException: logs\Formatting.log.lck
        at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
        at java.base/sun.nio.fs.WindowsFileSystemProvider.newFileChannel(WindowsFileSystemProvider.java:120)
        at java.base/java.nio.channels.FileChannel.open(FileChannel.java:292)
        at java.base/java.nio.channels.FileChannel.open(FileChannel.java:345)
        at java.logging/java.util.logging.FileHandler.openFiles(FileHandler.java:511)
        at java.logging/java.util.logging.FileHandler.<init>(FileHandler.java:341)
        at de.dhbw.mosbach.inf19b.programmieren2.game.utilities.logging.Logging.addFileHandler(Logging.java:58)
        at de.dhbw.mosbach.inf19b.programmieren2.game.utilities.logging.Formatting.<clinit>(Formatting.java:39)
        at de.dhbw.mosbach.inf19b.programmieren2.game.utilities.Constants.<clinit>(Constants.java:34)
        at de.dhbw.mosbach.inf19b.programmieren2.game.utilities.logging.Logging.<clinit>(Logging.java:40)
        at de.dhbw.mosbach.inf19b.programmieren2.game.main.StartJar.<clinit>(StartJar.java:21)

当然 .lck 不存在,现在就创建 Handler...

如果我使用p.normalize().toAbsolutPath(),也会出现同样的错误。我不能使用 Stream,因为它创建了 FileHandler...就像我发现的任何Solution 中提到的...

为什么会这样?如何预防?

【问题讨论】:

您确定logs 目录存在吗? 它甚至不在 IDE 中,而是由处理程序创建的。但他以某种方式搜索 lck 文件 问题是,如果我在启动程序之前自己创建 .lck 文件,那么它会按预期工作......但这不能成为解决方案,因为它不是非常用户友好 【参考方案1】:

嗯...谢谢VGR...

我刚刚在 FileHandler 初始化之前添加了这个。现在它每次都可以工作。我可能只是愚蠢,认为该目录是从 FileHandler 而不是 IDE 之前创建的。

if (!Files.exists(p.getParent())) 
            Files.createDirectory(p.getParent());

【讨论】:

以上是关于FileHandler 创建会导致 NoSuchFileException 导致缺少 .lck的主要内容,如果未能解决你的问题,请参考以下文章

使用带有来自java.util.logging的FileHandler的logger时,不需要.0扩展日志文件

日志logging

logging将日志写入文件filehandler

php 的FileHandler

属性的级别值不正确,无法为java.util.logging.FileHandler设置级别

java.util.logging FileHandler.count 不工作