-1

我有以下代码并使用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-resourcesforFileHandler以便自动关闭资源(以消除关闭资源的手动工作)。

我尝试的代码如下:

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 自动关闭文件处理程序?

  • 我需要手动关闭吗?或者我可以采取任何其他方法。

4

1 回答 1

1

首先,FileHandler类不实现AutoCloseable接口。

所以,你不能使用try-with-resourceson 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();
    } 
  }

}
于 2020-06-05T11:40:06.617 回答