Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为java.util.logging.FileHandler使用try with资源?_Java_Try With Resources_Autocloseable - Fatal编程技术网

如何为java.util.logging.FileHandler使用try with资源?

如何为java.util.logging.FileHandler使用try with资源?,java,try-with-resources,autocloseable,Java,Try With Resources,Autocloseable,我正在编写下面的代码,并使用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() }; } 这个代码有效。现在,我认为

我正在编写下面的代码,并使用
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
接口。因此,我决定对
FileHandler
使用
try with resources
,以便自动关闭资源(删除关闭资源的手动作业)

我尝试的代码如下所示:

try(fh = new FileHandler("Test.log")) {
logger.addHandler(fh);
...
} catch (IOException e) {
e.printStackTrace();
}
但是这个代码不起作用

它给出了一个错误,即:

资源类型FileHandler未实现java.lang.AutoCloseable'

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

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


首先,
文件处理程序
类没有实现
自动关闭
接口

因此,您不能在
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
类,并在其中实现
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();
    } 
  }

}

这没有道理。您需要处理程序保持打开状态。为什么要将
FileHandler
添加到记录器,然后将其关闭?它没有实现
自动关闭
,因为它不应该这样使用。为什么不通过配置文件执行此操作?@AnishB。哦,是的。请参阅。为了记录,实际上有一个增强请求要使
Handler
实现
AutoCloseable
——因此可能有这样的用例:@bharathiraja,现在可以了吗?这个答案在向OP展示如何避免编译器错误时,是一个非常糟糕的主意。关闭日志处理程序而不将其从日志框架中删除意味着您刚刚将日志框架置于不确定状态。后续日志消息可能会被删除,或者可能导致应用程序异常。1<代码>自动关闭不是一个类,而是一个接口。2.OP的问题在某种程度上毫无意义,你甚至还没有确定,更不用说解决了。这段代码将执行,但它不会完成任何有用的事情。@正如我在注释中已经解释的那样。我不会使用FileHandler记录应用程序日志。我的场景是在任何异常发生或任何验证失败时记录特定信息。例如,我有一个csv,我正在读取并检查文件是否为有效格式或有效文件名。如果文件名无效,那么我应该写文件名无效。以及生成日志的每个csv文件。示例test.csv将包含test.log,文件中将包含所需的异常详细信息。对于应用程序日志,我已经配置了log4j2,这将包含所有特定于应用程序的日志。@您仍然认为,对于上述场景,我不应该使用
java.util.logging.FileHandler