3 回答
TA贡献2011条经验 获得超2个赞
根据Class.getResourceAsStream
:
此方法委托给此对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给 ClassLoader.getSystemResourceAsStream。
在委托之前,使用以下算法从给定的资源名称构造一个绝对资源名称:
如果名称以“/”(“\u002f”)开头,则资源的绝对名称是“/”后面的名称部分。
否则,绝对名称采用以下形式:
modified_package_name/name
其中, modified_package_name 是此对象的包名称,用“/”代替“.”。('\u002e')。
我是这样理解评论的:
如果使用
ClassLoader.getResourceAsStream
,则从包根发送绝对路径,但省略第一个/
.如果使用
Class.getResourceAsStream
,请发送相对于当前Class
对象的路径(并且该方法将考虑包),或者发送从包根目录开始的绝对路径,以/
.
但除此之外,您还需要了解您的构建系统。使用 maven,资源文件存储在src/main/resources
.
因此,在您的情况下,我认为进行以下更改应该可以解决问题:
将文件放入
src/main/resources
.将代码更改为
this.getClass() .getResourceAsStream("/property_table.config.txt") //or `Config.class.getResource...
或者,使用
this.getClass().getClassLoader() .getResourceAsStream("property_table.config.txt")`
我已经用类似的设置尝试过这个,它按预期工作。
TA贡献1821条经验 获得超4个赞
ClassLoader().getResourceAsStream()
仅在类路径中查找文件。您需要的是将您的配置文件放在类路径中的目录中。
因此,您有以下选择:
当您从命令行运行 Java 应用程序时,您可以在 -cp 参数或 CLASSPATH 系统变量中设置目录路径。要点是:您需要从中获取配置文件的目录必须在类路径中 - 而不是文件。(例如,如果文件位置是
c:\my_projects\test-project\config\my_config.properties
并且c:\my_projects\test-project\
在类路径中,则getResourceAsStream
调用将是ClassLoader().getResourceAsStream("config/my_config.properties")
您可以将文件打包成 jar 文件,jar 文件的根目录是
getResourceAsStream("config/my_config.properties")
如果您的 Maven 项目是 jar 项目,则需要使用 Maven 资源插件将其他资源放入 jar 中。
顺便说一句:Maven 不会将任何内容放入 src/main/java/ 目录中的 jar 文件中(如果您没有为资源插件明确指定它)
如果您在 Maven 项目中使用 Eclipse 之类的 IDE,则 src/main/resources 是构建类路径的一部分。仔细检查它是否存在,如果不存在 - 执行“更新 Maven 项目”或手动添加它。
只有当您在 IDE 中而不是从独立 Jar 文件中运行项目时,ClassLoader 才会从 src/main/resources 文件夹中看到您的属性文件 - 如果您没有打包文件或在类路径中提供位置。
添加回答
举报