【问题标题】: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 目录中

但我得到一个FileNotFoundExceptionjava.lang.NullPointerException(如果使用注释掉的行而不是第一行)

我在这里做错了什么?我有什么误解?

【问题讨论】:

标签: java file properties properties-file


【解决方案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);
        

        【讨论】:

          猜你喜欢
          • 2011-11-27
          • 2016-05-18
          • 2011-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          • 2011-06-14
          • 1970-01-01
          相关资源
          最近更新 更多