我有下面的代码,并在创建日志文件时使用了 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 自动关闭文件处理程序?
我需要手动关闭吗?或者有其他的方法可以使用。
首先。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();
}
}
}