扫描仪:摆脱 "Resource leak: '<unassigned Closeable value>' is never closed"
Scanner: Getting rid of "Resource leak: '<unassigned Closeable value>' is never closed"
我正在尝试制作一种实用方法来从 Spring Boot 中的资源中读取文本文件。为了阅读我面对的文件 InputStream
s:
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#1 和 try#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();
}
}
我不确定到底是什么导致资源泄漏,但我相信它是您使用的命令链接
我正在尝试制作一种实用方法来从 Spring Boot 中的资源中读取文本文件。为了阅读我面对的文件 InputStream
s:
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#1 和 try#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();
}
}
我不确定到底是什么导致资源泄漏,但我相信它是您使用的命令链接