【发布时间】:2020-06-19 18:00:19
【问题描述】:
使用 Java 8、Tomcat 8+。
我遇到过这样的问题 - 我正在尝试读取 lib 中 jar 中的 txt 资源。我使用了以下代码:
import java.io.File;
import org.apache.commons.io.FileUtils;
// ....
// code within some class method
File file = new File(superService.getClass().getClassLoader()
.getResource("com/domain/example/sorry/confidential/little_text.txt")
.getFile())
return FileUtils.readFileToString(file, "UTF-8")
虽然它在我的 Intellij IDEA 上运行良好,但在 Tomcat 服务器上部署后我得到了这样的异常:
java.io.FileNotFoundException: 文件 ‘文件:/usr/local/tomcat/webapps/prod-lims/WEB-INF/lib/abc-1.2-SNAPSHOT.jar!com/domain/example/sorry/confidential/little_text.txt’ 不存在
之后,我在 SO 和其他网站中找到了很多答案,我需要使用 ClassLoader.getResourceAsStream() 或 Class.getResourceAsStream() 方法来获取 JAR 中的资源。当然,我尝试以旧式方式重新设计我的代码 - 瞧! - 现在可以使用了:
import java.io.BufferedReader;
import java.io.InputStreamReader;
// ....
// code within some class method
InputStream inputStream = superService.getClass().getClassLoader()
.getResourceAsStream("com/domain/example/sorry/confidential/little_text.txt")
StringBuilder resultStringBuilder = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))
try {
String line;
while ((line = br.readLine()) != null) {
resultStringBuilder.append(line).append("\n");
}
} catch(Exception e) {
//just a formal catch - don't mind for now
}
return resultStringBuilder.toString()
好的,我对这个可行的解决方案很满意。但是我在任何地方都找不到任何明确的解释:为什么 getResourceAsStream 有效,同时“文件”方法不适用于 JAR 中的资源?我很好奇,因为superService.getClass().getClassLoader().getResource("com/domain/example/sorry/confidential/little_text.txt") 返回不为空,但构造的文件有canRead() == false 和isExist() == false。
【问题讨论】:
标签: java classloader