Java 文件句柄不会关闭

标签 java file filehandle java.util.logging

是的这个问题之前已经被问过,但问题似乎有点复杂。我已经使用了之前与此相关的问题中的所有解决方案。

涉及: Freeing Java File Handles , Java keeps file locks no matter what

package me.test;

import java.io.File;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class Test {
    Logger log = Logger.getAnonymousLogger();
    FileHandler handle;

    final static String newline = System.lineSeparator();
    /**
     * @param args
     */
    public static void main(String[] args) {
        Test t = new Test();
        t.run();
    }
    public void run()
    {
        for (int i = 0; i < 6; i++) {
            testLogs();
            change();
        }
        testLogs();
        if (handle != null)
        {
            handle.close();
            log.removeHandler(handle);
        }
    }
    public static FileHandler craftFileHandler(File file, boolean append)
    {
        if (file == null)
            return null;
        FileHandler fh = null;
        try {
            fh = new FileHandler(file.getPath(), append);
            fh.setFormatter(new Formatter() {

                @Override
                public String format(LogRecord record) {
                    return "[test] " + "[" + record.getLevel().toString() + "]" + String.format(record.getMessage(), record.getParameters()) + newline;
                }
            });
            return new FileHandler(file.getPath(), append);
        } catch (Exception e) {
            if (fh != null)
                fh.close();
            return null;
        } 
    }

    public void change()
    {
        if (handle != null)
        {
            handle.flush();
            handle.close();
            log.removeHandler(handle);
        }
        handle = null;
        File f = new File("log.log");
        handle = craftFileHandler(f, true);
        System.out.println(f.getAbsolutePath());
        if (handle != null)
            log.addHandler(handle);
    }
    public void testLogs()
    {
        if (log == null)
        {
            log = Logger.getLogger("test");
            log.setLevel(Level.ALL);
        }
        log.info("This is info #1");
        log.warning("Warning 1");
        log.info("meh info again.");
        log.severe("SEVERE HELL YA NICE TEST");
        log.info("You sure its good here?");
        log.info("Handler count " + log.getHandlers().length);
    }
}

此代码是测试代码。我制作了这个测试文件,以便我可以弄清楚如何在我的项目上解决这个问题。

我之所以会出现这样的循环,是因为问题发生得太快而无法解释。所以循环是模拟它的最好方法。在我的项目中,有一个日志文件的配置来选择放置它的位置。但是,如果文件在重新加载时未在配置中更改。它往往会锁定文件并创建额外的文件每次重新加载

我想让这个工作正常进行。如果这开始正常工作。然后我就可以在我的项目中正确实现它。

最佳答案

您正在创建多个文件,因为您正在创建 FileHandler 并且从未关闭它。

fh = new FileHandler(file.getPath(), append);
...
return new FileHandler(file.getPath(), append);

修复?

return fh;

最终与否完全没有区别。在这种情况下,您实际上确实希望在 catch block 中关闭,因为如果您不这样做,则没有任何东西能够关闭它。

关于Java 文件句柄不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18392273/

相关文章:

java - Spring boot MVC不使用指定的自定义StringHttpMessageConverter

c++ - openCV 存储文件错误 :

c - 如何查看是否已到达文件开头?

python - 如何将 1 个字节写入二进制文件?

c - 系统调用 - 如何在字符串中查找字符(如果该字符存在)

Java如何在Apache POI上进行搜索和替换时避免覆盖模板文件

java - 如何从 REST Controller 端点返回 LocalDateTime?

java - 在 Spring MVC 中使用 JSR-303 注释进行条件验证

java - 文件还没有找到

perl - 在程序中使用 __DATA__