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

How to use try-with-resources for java.util.logging.FileHandler?

我有以下代码并使用 java.util.logging.FileHandler 创建日志文件。

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

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'

首先,FileHandler class 没有实现 AutoCloseable 接口。

因此,您不能在 FileHandler 上使用 try-with-resources

因此,您必须显式调用 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 class 并在其中实现 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();
    } 
  }

}