扫描仪:摆脱 "Resource leak: '<unassigned Closeable value>' is never closed"

Scanner: Getting rid of "Resource leak: '<unassigned Closeable value>' is never closed"

我正在尝试制作一种实用方法来从 Spring Boot 中的资源中读取文本文件。为了阅读我面对的文件 InputStreams:

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

(注意Resource#getInputStream 抛出 IOException

然后我尝试使用 stupid scanner tricks 中提到的 Scanner 而不是 Reader 或其他东西,因为它是 elegant-simple 这样做的方法。

但是,我无法摆脱问题标题中提到的警告。即使我只是简单地调用 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#1try#2 会抛出警告吗?我猜 try #3 不会,因为我们捕获了所有可能的异常。但唯一可以抛出的异常是 IOException from getInputStream() 方法。如果 Scanner 怀疑有任何异常,为什么不强制我们捕获这个异常?毕竟,不推荐使用 Exception 捕获异常。

最后,我想,这可能是 STS(Spring 工具套件)的问题?

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

问题实际上出在 useDelimiter() 上,因为以下代码没有这样的问题,应该会产生相同的结果:

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

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