Java:无法加载属性文件。为啥?
Posted
技术标签:
【中文标题】Java:无法加载属性文件。为啥?【英文标题】:Java: Can not load a properties file. Why?Java:无法加载属性文件。为什么? 【发布时间】:2012-04-19 21:09:19 【问题描述】:我正在尝试加载属性文件。 我的属性文件与我要加载的类在同一目录中。 示例:
package com.classes.internal;
public class ClassA
private static String PFILE = "config.properties";
private static void methodA()
//do stuff
Properties properties = null;
try
properties = new Properties();
properties.load(new FileInputStream(PFILE));
//properties.load(new ClassA().getClass().getResourceAsStream(PFILE)); --> Does not work either
catch(Exception e)
e.printStackTrace();
还有config.properties
文件在 com\classes\internal 目录中
但我得到一个FileNotFoundException
或java.lang.NullPointerException
(如果使用注释掉的行而不是第一行)
我在这里做错了什么?我有什么误解?
【问题讨论】:
属性文件相对于你的类路径在哪里? 与ClassA
在同一目录下
类似问题:***.com/questions/7688710/…
【参考方案1】:
该文件需要位于您正在执行的目录中,而不是类文件所在的目录中。
所以如果你有目录结构
项目/com/classes/内部
然后你运行命令
Project$ java com.classes.internal.SomeClass
您的 JVM 将在“Project”目录中查找“config.properties”文件。
【讨论】:
我不确定我是否理解这一点。但是getClass().getResourceAsStream
等是什么意思?
getClass().getResourceAsStream
正在查找当前类的源文件所在的文件夹中的文件。尝试通过将config.properties
文件放在前面所述的文件夹中来执行System.out.println(new ClassA().getClass().getResourceAsStream("config.properties"));
。【参考方案2】:
我认为您的程序工作目录不在 com\classes\internal 中。尝试传递这个相对路径:
com\classes\internal\config.properties
或绝对路径。 您可以像这样获取当前工作目录
String currentDir = new File(".").getAbsolutePath();
【讨论】:
【参考方案3】:properties.load(this.getClass().getResourceAsStream(
"/com/classes/internal/" + PFILE));
【讨论】:
没有this
。我在static
方法中
..当您使用早期的表单时发生了什么,以及更改后的位置字符串?请注意,我没有心情玩“20 个问题”——在提供答案时采取一点主动性是值得的。【参考方案4】:
下面的行将加载相对于工作目录的文件(在 FrankieTheKneeMan 示例中,“Project”文件夹。如果您在 Tomcat 中运行代码,很可能来自 $Tomcat/bin/):
properties.load(new FileInputStream(PFILE));
对于下面的行,它正在加载相对于您的类路径的文件。所以“config.properties”指的是包含“com”文件夹的目录,而不是“com/classes/internal/”。
properties.load(new ClassA().getClass().getResourceAsStream(PFILE));
所以你需要决定是从类路径加载,还是从工作目录加载。
【讨论】:
【参考方案5】:示例。我用的是eclipse项目结构,还是希望你能看懂:
//File in Project/src/com/classes/internal/config.properties
InputStream in = ClassA.class.getResourceAsStream("config.properties");
Properties p = new Properties();
try
p.load(in);
catch(IOException e)
e.printStackTrace();
如果您决定将文件放在包之外:
//File in Project/src/config.properties
InputStream in = ClassA.class.getClassLoader().getResourceAsStream("config.properties");
请注意,getResourceAsStream
文件必须包含在您的类路径中。
【讨论】:
【参考方案6】:直接在源文件夹中创建一个config包,并将config.properties文件放入其中。在构建应用程序时,它将转到 /WEB-INF/classes/config/config.properties
然后您可以使用以下代码访问属性文件 -
Properties prop = new Properties();
String propFileName = "/config/config.properties";
InputStream input = null;
input = ClassA.class.getResourceAsStream(propFileName);
prop.load(input);
【讨论】:
以上是关于Java:无法加载属性文件。为啥?的主要内容,如果未能解决你的问题,请参考以下文章