如何在java.util.logging.FileHandler中使用try-with-resources?

问题描述 投票:0回答:1

我有下面的代码,并在创建日志文件时使用了 java.util.logging.FileHandler.

在这种情况下,我应该手动关闭最后块中的资源。

try {
fh = new FileHandler("Test.log");
logger.addHandler(fh);
...
} catch (IOException e) {
e.printStackTrace();
} finally {
  if(fh!=null) { fh.close() };
}

这段代码是可行的。现在,我想它可以实现 Autocloseable 介面。所以,我决定使用 try-with-resources 对于 FileHandler 这样资源就会自动关闭(以消除手动关闭资源的工作)。

我尝试的代码如下。

try(fh = new FileHandler("Test.log")) {
logger.addHandler(fh);
...
} catch (IOException e) {
e.printStackTrace();
}

但是这段代码无法工作。

它给出了一个错误信息,说:

The resource type FileHandler does not implement java.lang.AutoCloseable'

  • 如果可能的话,如何使用 try-with-resources 自动关闭文件处理程序?

  • 我需要手动关闭吗?或者有其他的方法可以使用。

java try-catch try-with-resources filehandler autocloseable
1个回答
1
投票

首先。FileHandler 类没有实现 AutoCloseable 的接口。

所以,你不能使用 try-with-resources 关于 FileHandler.

因此,你必须调用 close() 方法显式。

所以,你必须选择你采取的第一个方法。

public class Example {

    private static Logger logger = Logger.getLogger("...");

    public static void main(String[] args) {
        FileHandler fh = null;
        try {
            fh = new FileHandler("Test.log");
            logger.addHandler(fh);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fh != null) {
                fh.close();
            }
        }
    }

}

你可以尝试创建你自己的自定义 Filehandler 类并实施 AutoCloseable 中的接口。

比如说:

class CustomFileHandler implements AutoCloseable {

    private FileHandler fileHandler;

    public CustomFileHandler(FileHandler fileHandler) {
        this.setFileHandler(fileHandler);
    }

    @Override
    public void close() throws Exception {
        if (fileHandler != null) {
            fileHandler.close();
        }
    }

    public FileHandler getFileHandler() {
        return fileHandler;
    }

    private void setFileHandler(FileHandler fileHandler) {
        this.fileHandler = fileHandler;
    }

}

public class Example {

  private static Logger logger = Logger.getLogger("...");

  public static void main(String[] args) {
    try (CustomFileHandler fh = new CustomFileHandler(new FileHandler("Test.log"))) {
        logger.addHandler(fh.getFileHandler());
        ........
    } catch (Exception e) {
        e.printStackTrace();
    } 
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.