我正在尝试制作一种实用程序方法来从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)
答案 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();
}
}
我不确定是什么导致了资源泄漏,但是我相信它是您使用的命令链