Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我给出属性文件的相对路径时,FileNotFoundException_Java_Fileinputstream_Properties File - Fatal编程技术网

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

Java 当我给出属性文件的相对路径时,FileNotFoundException,java,fileinputstream,properties-file,Java,Fileinputstream,Properties File,我正在尝试使用属性文件存储我的DB连接详细信息。当我创建一个Java应用程序并给出文件名时,它就起作用了,因为我将属性文件放在了项目根文件夹中 但是,当我在我的Web应用程序中尝试此操作时,我会得到一个FileNotFoundException。我在项目节点下创建了一个res目录来保存属性文件。然后我将路径设置为“res/db.properties”,但我得到了一个异常。我还尝试将此文件放在configuration files目录下,但仍然得到相同的异常 这是我的密码- import

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

但是,当我在我的Web应用程序中尝试此操作时,我会得到一个FileNotFoundException。我在项目节点下创建了一个res目录来保存属性文件。然后我将路径设置为“res/db.properties”,但我得到了一个异常。我还尝试将此文件放在configuration files目录下,但仍然得到相同的异常

这是我的密码-

    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;

            }

        }
    }

我做错了什么?

当您将当前目录作为web应用程序运行时,它很可能是不同的。。。有一个系统属性将告诉您当前目录是什么。或者,您可以使用Class.getResource使用classpath查找res目录

  • 作为一个web应用程序,您无法预测当前的工作目录,因此使用相对路径总是有问题的
  • 根据web应用程序的打包方式,属性文件甚至可能不是文件系统对象。它很可能是埋在.war文件中的资源
访问此文件的一种可靠方法是将其构建到web应用程序的web-INF目录中。然后,您可以使用访问它


或者,您可以将其构建到WEB-INF/classes目录中,并使用加载它。

您的主要错误是试图加载带有文件相关类的资源。属性文件是应用程序的资源,因此应该相对于此应用程序放置

“相对”是指“在类路径中”

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

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

继续(省略异常处理):


res
是源文件夹吗?直接尝试使用
db.properties
。是的,我在发布之前已经尝试过了。我添加了
res
作为源程序包文件夹,然后运行web应用程序,但仍然得到
FileNotFoundException
。直接给出文件名也不起作用(这是我在项目根目录中的第一个setup-prop文件)。“getRessource”功能是搜索文件的最佳方式。@Steve指出-谢谢!我能够按照中的建议解决我的问题。但我仍然有疑问。这与将我的连接细节放入变量并使用它们有什么不同?如果我遵循这种方法,我将不得不替换WAR文件并重新部署。我使用prop文件的想法是,这样我就可以使用它并有效地更改数据库连接细节,而不必重新部署整个应用程序!通常的策略是在应用程序服务器中配置数据源,查找(或将其注入)到应用程序中,然后使用它提供数据库连接。这会将所有与连接相关的信息放在服务器配置中,而不是应用程序中。
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;