我正在尝试使用属性文件来存储我的数据库连接详细信息。当我将属性文件放在项目根文件夹中时,它创建了一个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;
}
}
}
我在这里做错了什么?
答案 0 :(得分:3)
您访问此文件的一种可靠方法是将其构建到您的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;