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