FileNotFoundException当我给出属性文件的相对路径时

时间:2014-09-08 12:40:31

标签: java fileinputstream properties-file

我正在尝试使用属性文件来存储我的数据库连接详细信息。当我将属性文件放在项目根文件夹中时,它创建了一个Java应用程序并给出了文件名。

但是,当我在Web应用程序中尝试此操作时,我收到 FileNotFoundException 。我在项目节点下创建了一个res目录来保存属性文件。然后我将路径作为" res / db.properties"但我得到了例外。我也尝试将此文件放在配置文件目录下,但仍然有相同的例外。

这是我的代码 -

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.util.Properties;

    /**
     *
     * @author aj
     */
    public class getConfigValues {

        public String[] getPropValues() {
            String[] props = new String[4];

            try {
                Properties prop = new Properties();
                String propFileName = "res/db.properties";

                InputStream input = null;

                input = new FileInputStream(propFileName);
                prop.load(input);

                props[0] = prop.getProperty("dbURL");
                props[1] = prop.getProperty("driverClass");
                props[2] = prop.getProperty("user");
                props[3] = prop.getProperty("password");

                return props;

            } catch (FileNotFoundException ip) {

                props[0] = "not found";

                return props;
            } catch (IOException i) {
                props[0] = "IO";

                return props;

            }

        }
    }

我在这里做错了什么?

3 个答案:

答案 0 :(得分:3)

  • 作为一个Web应用程序,您无法预测当前的工作目录,因此使用相对路径将始终存在问题;
  • 根据Web应用程序的打包方式,您的属性文件甚至可能不是文件系统对象。它可能是埋藏在.war文件中的资源。

您访问此文件的一种可靠方法是将其构建到您的Web应用程序的WEB-INF目录中。然后,您可以使用javax.servlet.ServletContext.getResourceAsStream("WEB-INF/res/db.properties")访问它。

或者,您可以将其构建到WEB-INF / classes目录中并使用java.lang.ClassLoader.getResourceAsStream("/res/db.properties")加载它。

答案 1 :(得分:0)

当您将其作为Web应用程序运行时,当前目录很可能是不同的...有一个System属性可以告诉您当前目录是什么。或者,您可以使用Class.getResource来使用类路径来查找res目录

答案 2 :(得分:0)

您的主要错误是尝试使用与文件相关的类加载资源。属性文件是应用程序的资源,因此应该相对放置到此应用程序。

“相对”意味着“在课程路径中”。

在独立应用程序中,只需确保将这些资源的目录作为类路径的一部分提及。在Web应用程序中,目录WEB-INF/classes已经是应用程序类路径的一部分。

现在回答第二部分:如何加载这些资源?简单地说:使用ClassLoader。它的职责不仅是加载类,还要加载资源(例如属性文件)。

继续(省略异常处理):

ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL resourceUrl = loader.getResource("res/db.properties");
Properties properties = new Properties();
try(InputStream input = resourceUrl.openStream()) {
    properties.load(input);
}
String[] result = new String[4];
...
return result;