- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有类似下面的项目结构
-project
-src/main/java // source folder
-com.mypackage
-Utility.java
-some.properties
-src/main/resources // source folder
-configuration_files
-configuration_report.txt
我正在使用 Eclipse 的 Export
功能生成 jar
。上面的内容转换为具有以下结构的 jar
:
-myjar.jar
-com
-mypackage
-Utility.class
-some.properties
-configuration_files
-configuration_report.txt
在 Utility
类中,我尝试从 configuration_report.txt
获取 InputStream
。
我正在这样做(在 static
方法中):
Utility.class.getResourceAsStream("/configuration_files/configuration_report.txt");
this question 的答案似乎证实了这一点,因为该文件与请求它的类不在同一个包中。
但是,当我运行它时,它返回 null
。为什么?
请注意,对于 some.properties
文件,我可以同时执行这两项操作
Utility.class.getResourceAsStream("/com/package/some.properties");
Utility.class.getResourceAsStream("some.properties");
我会得到流。
如果有任何不同,我会从命令行运行它。
java [-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044] -cp myjar.jar MyMain
如果我尝试在 Eclipse 中运行它,它会工作...
编辑:
这段代码是相关的。不管有没有前面的/
,它都返回null
String sourceFilePath = "/configuration_files" + File.separator + "configuration_report.txt";
InputStream in = Utility.class.getResourceAsStream(sourceFilePath);
最佳答案
经过多次尝试,解决方案归结为 ClassLoader#getResource(String)
的这个小 javadoc 条目:
The name of a resource is a '/'-separated path name that identifies the resource.
我最初发布的代码片段会起作用
Utility.class.getResourceAsStream("/configuration_files/configuration_report.txt");
但我没有使用 /
,我在编辑时使用了 File.separator
:
String sourceFilePath = "/configuration_files" + File.separator + "configuration_report.txt";
认为类加载器的工作方式类似于特定于操作系统的文件操作。第一个 /
匹配,但 File.separator
评估为 \\
因为我在 Windows 上。
Class#getResource(String)
的 javadoc说的更多。
Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e').
至于为什么这在 Eclipse 上有效,但在命令行中无效,我仍然不确定,但请查看下面@andy 的评论。
这article给出的是对这种情况的一个很好的解释。
关于java - 在不同的包中类 getResourceAsStream() 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320170/
我是一名优秀的程序员,十分优秀!