扫描程序:摆脱“资源泄漏:'<unssigned closeable =“” value =“”>'从未关闭”

时间:2019-03-08 09:16:03

标签: java spring exception java.util.scanner try-with-resources

我正在尝试制作一种实用程序方法来从Spring Boot中的资源读取文本文件。为了读取文件,我将它们作为InputStream面对它们:

Resource resource = new ClassPathResource(fileLocationInClasspath);
InputStream resourceInputStream = resource.getInputStream();

(请注意,Resource#getInputStream 引发IOException

然后,我尝试使用stupid scanner tricks中提到的 Scanner 代替Reader之类的东西,因为这是一种非常简单的方法。 / p>

但是,我很难摆脱问题标题中提到的警告。即使我只是简单地调用scanner.close()(在Java-8方式之前),该警告仍将保留。

尝试#1(第一个尝试):

public static String readFileFromResources(String fileName) throws IOException {
    try (Scanner sc = new Scanner(new ClassPathResource(fileName).getInputStream()).useDelimiter("\\A")) {
        return sc.next();
    }
}

尝试#2:

public static String readFileFromResources(String fileName) throws IOException {
    Scanner sc = new Scanner(new ClassPathResource(fileName).getInputStream()).useDelimiter("\\A");
    String text = sc.next();
    sc.close();
    return text;
}

尝试#3(警告消失):

public static String readFileFromResources(String fileName) throws IOException {
    try (Scanner sc = new Scanner(new ClassPathResource(fileName).getInputStream()).useDelimiter("\\A")) {
        return sc.next();
    } catch (Exception e) // Note Exception class
    {
        throw new IOException(e); //Need to catch this later
    }
}

有人可以解释为什么 try#1 try#2 引发警告吗?我猜尝试#3 不会,因为我们捕获了所有可能的异常。但是唯一可以抛出的异常是IOException中的getInputStream()方法。如果Scanner可疑有任何异常,为什么不强制我们捕获该异常?毕竟,不建议使用Exception捕获异常。

最后,我想,也许这是STS(Spring工具套件)问题?

(如果有任何作用-> JDK版本:1.8.0_191)

1 个答案:

答案 0 :(得分:0)

该问题实际上与useDelimiter()有关,因为以下代码没有此问题,并且应产生相同的结果:

public static String readFileFromResources(String fileName) throws IOException {
    try (Scanner sc = new Scanner(new ClassPathResource(fileName).getInputStream())) {
        sc.useDelimiter("\\A");
        return sc.next();
    }
}

我不确定是什么导致了资源泄漏,但是我相信它是您使用的命令链