2

在 Java 中存储和加载应用程序级属性的最佳方式是什么。

.net 有什么类似的东西,我只需在 app.config 中放一些东西

 <appSettings>
    <add key="emailAddress" value="me@example.com" />
  </appSettings>

然后像这样检索它:

string AdminEmail = ConfigurationManager.AppSettings["emailAddress"];

我是否必须将属性文件加载到文件流等中?似乎是不必要的工作。

我试过这个:

Properties props = new Properties();

FileInputStream fis = new FileInputStream("myProps.properties");
props.load(fis);
fis.close();

但这是给我一个 java.io.FileNotFoundException 异常。与类相关的属性文件需要转到哪里?

4

6 回答 6

4

Preferences API提供了这个功能。它有很多缺点,但是如果您希望以与操作系统无关的方式来执行此操作,这是使用标准 Java 运行时库完成此操作的唯一方法。当然,您始终可以编写自己的特定于操作系统的代码来满足您的需求。是的,您可以编写简单的代码来加载属性文件,但该文件的位置可能会成为跨多个操作系统的问题。我假设由于您正在用 Java 编写桌面应用程序,因此您关心操作系统的可移植性。否则,Java 可能不是桌面应用程序的最佳选择。

于 2010-01-20T17:57:03.043 回答
2

如果您使用这样的 FileInputStream,您的路径是相对于操作系统的当前目录,通常是启动目录。

如果您改为使用 Java 内置资源机制(如API 中所述,getResourceAsStream() 等),则路径将相对于您的类的位置。使用这种方法,您还可以从 jar 甚至通过网络(例如 Applet)加载资源。使用的概念是一种虚拟文件系统,在 Java 行话中称为“类路径”。有一篇devx文章更详细地介绍了它。

简而言之,这种代码运行良好:

Properties prop = new Properties();
//with properties in the same dir as current class
prop.load(getClass().getResourceAsStream("my.properties")); 
//with properties in the root dir of your jar, or in base of classpath
prop.load(getClass().getResourceAsStream("/my.properties"));

您将需要添加错误处理...

于 2010-01-20T17:46:52.503 回答
1

通常,它会尝试从应用程序的当前目录加载,具体取决于您运行它的方式。您应该能够通过执行以下操作在运行时确定这一点:

String currentFolder = System.getProperty("user.dir");
于 2010-01-20T17:46:07.120 回答
0

在这种情况下,它要查找的文件路径与您启动 java 应用程序的位置有关。这不是主类或 jar 文件的位置,而是您调用 Java 的位置。如果您使用调用 Java 的脚本启动应用程序,那么它就是该目录。

例如,您的应用程序捆绑在一个 jar 文件“app.jar”中。将“myProps.properties”放在同一目录中,然后从该目录运行“java -jar app.jar”。它应该以这种方式找到您的属性文件。

于 2010-01-20T17:43:56.330 回答
0

您可以将属性与 ResourceBundle 一起使用。我在应用程序中使用它来存储不同语言的标签、按钮和消息

首先,您创建一个属性文件,例如test.properties。这是一个文本文件,在其中您可以输入如下信息:

propertyname=value

在你的情况下

emailAddress=me@example.com
email2=blablabla@example.com

等等...

要在代码中获取此属性,请使用您的属性文件的名称创建一个 ResourceBundle 对象以调用这些属性。

ResourceBundle rb = ResourceBundle.getBundle("test");

要从属性文件中获取特定值,只需调用 ResourceBundle

String value = rb.getString("emailAddress");

这样,字符串命名值包含位于 test.properties 文件中的名为“emailAddress”的属性的值

String value2 = rb.getString("email2");

同样,名为 value2 的字符串包含位于 test.properties 文件中的名为“email2”的属性的值

于 2010-01-20T17:56:36.910 回答
0

当您不指定绝对路径时,选择的是当前路径。

这不完全是你问的,但如果你想使用 XML 文件作为配置,你可以看看Apache Commons Configuration

于 2010-01-20T18:00:35.590 回答