在Java桌面应用程序中加载应用程序属性

时间:2010-01-20 17:39:16

标签: java application-settings

在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异常。属性文件相对于类需要去哪里?

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

如果您改为使用Java内置资源机制(如in the 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"));

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

答案 2 :(得分:1)

通常它会尝试从应用程序的当前目录加载,这可能会根据您运行它的方式而有所不同。您应该能够在运行时通过执行以下操作来确定:

String currentFolder = System.getProperty("user.dir");

答案 3 :(得分:0)

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

比如说,你的应用程序捆绑在一个jar文件'app.jar'中。将'myProps.properties'放在同一目录中,然后从该目录运行'java -jar app.jar'。它应该找到你的属性文件。

答案 4 :(得分: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");

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

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

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

答案 5 :(得分:0)

如果未指定绝对路径,则选择的路径为当前路径。

这不完全是您的要求,但如果您想将XML文件用作配置,可以查看Apache Commons Configuration