我有以下代码。
public class PropertyReader {
private static Properties propsPath = new Properties();
private static Properties propsConf = new Properties();
private static PropertyReader instance = new PropertyReader();
private PropertyReader() {
readConfProperty();
}
private void readConfProperty() throws RuntimeException {
try {
String path = "";
if (System.getProperty("os.name").contains("Linux")) {
//path = System.getProperty("catalina.home") + "conf/businessportal.properties";
path = System.getProperty("/busDir/src/main/resources/businessportal.properties");
} else {
// path = System.getProperty("catalina.home") + "\\conf\\businessportal.properties";
path = System.getProperty("/busDir/src/main/resources/businessportal.properties");
}
Reader reader = new FileReader(path);
propsConf.load(reader);
} catch(Exception e) {
e.printStackTrace();
}
}
}
如何检查属性文件路径是否设置正确并可以从中访问数据?
答案 0 :(得分:1)
您似乎不太了解系统属性的工作原理,这是在回答您的问题之前的镜头说明:
系统属性用于在启动时将值传递给JVM或在运行时设置它们,可以使用System#getProperty方法检索这些值,方法是在JVM启动时或在运行时设置时将其关联名称传递给它
1-在JVM启动时传递系统属性
java -DmyVar=foo -cp myApp.jar pack.age.MyApp bar bat
在此示例中,您可以使用
检索myVar
String myVar = System.getProperty("myVar");
此调用之后,变量myVar
将具有值foo
。 bar
和bat
不能通过这种方式检索,它们是应用程序的参数,并按照在主方法的arguments数组中传递它们的顺序显示。
2-在运行时设置系统属性
System.setProperty("myVar", "foo")
,然后使用与之前相同的调用再次检索值。
现在回答您的问题:
1-您在活动代码中的调用不正确,因为/busDir/src/main/resources/businessportal.properties
似乎是您愿意获取的值,而不是您定义的名称,该名称将在应用程序中用于查找它。
在启动应用程序时,您应该使用类似的方式传递值,如上所示,通过设置-D
param来传递值:
-Dbusinessportal.config.path=/busDir/src/main/resources/businessportal.properties
,然后使用
在您的方法中将其检索String path = System.getProperty("businessportal.config.path");
这时,您将有一个包含配置文件路径的字符串,您可以像这样检查其存在:
private void readConProperty() throws IOException {
String strPath = System.getProperty("businessportal.config.path");
if (null == strPath) {
throw new RuntimeException("property businessportal.config.path not defined");
}
try (InputStream is = Files.newInputStream(Paths.get(strPath))) {
propsConf.load(is);
} catch (IOException e) {
throw new RuntimeException(String
.format("Error while loading config from %s", strPath), e);
}
}
2-您无需为了选择正确的文件分隔符而检查实际在哪个操作系统上运行应用程序,因为首先,当您启动应用程序时,您已经知道这可以传递正确的文件路径,其次,只要路径是跨平台兼容的,java Filesystem API便可以为您处理这些问题,并且可以在每种环境下与\
和/
一起使用,大多数相对路径和Windows绝对路径(如果省略驱动器号),并且应用程序在同一驱动器上启动。因此,您不能在Unix系统上使用类似C:\\conf\businessportal.properties
之类的东西,因为显然它包含仅适用于Windows主机的驱动器号。
3-最后,我看到您的属性文件位于源代码中的资源下方。您将无法直接从文件系统中加载它,因为打包应用程序时,路径src/main/resources
将不存在,并且所有内容都将被打包到应用程序的归档文件中,并将出现在应用程序的类路径中。然后,您需要使用Class#getResourceAsStream加载它,并向其传递资源名称,如下所示:
private void readConProperty() {
String resourceName = "/businessportal.properties";
try (InputStream is = getClass().getResourceAsStream(resourceName)) {
if (null == is) {
throw new RuntimeException(String
.format("Resource %s is not available", resourceName));
}
propsConf.load(is);
} catch (IOException e) {
throw new RuntimeException(String
.format("Error while loading config from %s", resourceName), e);
}
}