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