如何使用Java属性文件?
我有一个我想存储为Java属性文件的configuration值的键/值对列表,稍后加载并遍历。
问题:
- 我是否需要将文件存储在与将加载它的类相同的包中,或者是否存在应放置的特定位置?
- 该文件是否需要以任何特定的扩展名结尾或者是
.txt
好吗? - 我怎样才能加载代码中的文件
- 我怎么能遍历里面的值?
你可以传递一个InputStream给Property,所以你的文件几乎可以在任何地方被调用。
Properties properties = new Properties(); try { properties.load(new FileInputStream("path/filename")); } catch (IOException e) { ... }
迭代为:
for(String key : properties.stringPropertyNames()) { String value = properties.getProperty(key); System.out.println(key + " => " + value); }
-
您可以将文件存储在任何你喜欢的地方。 如果你想保存在你的jar文件中,你需要使用
Class.getResourceAsStream()
或ClassLoader.getResourceAsStream()
来访问它。 如果它在文件系统上,则稍微简单一些。 -
任何扩展都是好的,尽pipe.properties在我的经验中更为常见
-
如果使用的是 Java 6,则使用
Properties.load
加载文件,传入InputStream
或StreamReader
。(如果使用的是Java 6,我可能会使用UTF-8和Reader
而不是默认的ISO-8859- 1编码stream。) -
迭代迭代通过一个普通的
Hashtable
(从中派生的),例如使用keySet()
。 或者,您可以使用propertyNames()
返回的枚举。
如果将属性文件放在与Foo类相同的包中,则可以轻松地将其加载
new Properties().load(Foo.class.getResourceAsStream("file.properties"))
考虑到Properties扩展了Hashtable,你可以像在Hashtable中一样迭代这些值。
如果您使用* .properties扩展名,您可以获得编辑器支持,例如Eclipse有一个属性文件编辑器。
有许多方法可以创build和读取properties
文件:
- 将文件存储在相同的包中。
- 推荐
.properties
扩展,但是你可以select你自己的。 - 使用位于
java.util
package =>Properties
,ListResourceBundle
,ResourceBundle
类的这些类。 - 要读取属性,请使用迭代器或枚举器,或使用
Properties
或java.lang.System
类的直接方法。
ResourceBundle
类:
ResourceBundle rb = ResourceBundle.getBundle("prop"); // prop.properties System.out.println(rb.getString("key"));
Properties
类:
Properties ps = new Properties(); ps.Load(new java.io.FileInputStream("my.properties"));
这加载属性文件:
Properties prop = new Properties(); InputStream stream = ...; //the stream to the file try { prop.load(stream); } finally { stream.close(); }
我用.properties文件放在一个拥有所有configuration文件的目录中,我不把它和访问它的类放在一起,但是这里没有限制。
对于名字…我使用.properties为了冗长,我不认为你应该命名它.properties如果你不想要的。
例:
Properties pro = new Properties(); FileInputStream in = new FileInputStream("D:/prop/prop.properties"); pro.load(in); String temp1[]; String temp2[]; // getting values from property file String username = pro.getProperty("usernamev3");//key value in prop file String password = pro.getProperty("passwordv3");//eg. username="zub" String delimiter = ","; //password="abc" temp1=username.split(delimiter); temp2=password.split(delimiter);
为了:
- 您可以将文件存储在任何地方。
- 没有扩展是必要的。
- 蒙特克里斯托已经说明了如何加载这个。 这应该工作得很好。
- propertyNames()给你一个枚举来遍历。
默认情况下,Java会在应用程序的工作目录中打开它(这个行为实际上取决于所使用的操作系统)。 要加载文件,请执行以下操作:
Properties props = new java.util.Properties(); FileInputStream fis new FileInputStream("myfile.txt"); props.load(fis)
因此,任何文件扩展名都可以用于属性文件。 另外,只要可以使用FileInputStream
,文件也可以存储在任何地方。
如果您使用现代框架,相关说明框架可能会提供额外的方法来打开属性文件。 例如,Spring提供了一个ClassPathResource
来从JAR文件中使用一个包名来加载一个属性文件。
至于遍历属性,一旦属性被加载,它们被存储在提供propertyNames()
方法的java.util.Properties
对象中。
属性已经成为传统。 首选项类首选属性。
偏好数据分层集合中的一个节点。 此类允许应用程序存储和检索用户和系统首选项和configuration数据。 这些数据永久存储在一个依赖于实现的后台存储中。 典型的实现包括平面文件,特定于操作系统的registry,目录服务器和SQL数据库。 这个类的用户不需要关心后台存储的细节。
与基于string的键值对的属性不同的是, Preferences
类有几种方法来获取和放置基本数据到“首选项”数据存储中。 我们只能使用以下types的数据:
- 串
- 布尔
- 双
- 浮动
- INT
- 长
- 字节数组
要加载属性文件,可以提供绝对path,或者如果属性文件存在于类path中,则使用getResourceAsStream()
。
package com.mypack.test; import java.io.*; import java.util.*; import java.util.prefs.Preferences; public class PreferencesExample { public static void main(String args[]) throws FileNotFoundException { Preferences ps = Preferences.userNodeForPackage(PreferencesExample.class); // Load file object File fileObj = new File("d:\\data.xml"); try { FileInputStream fis = new FileInputStream(fileObj); ps.importPreferences(fis); System.out.println("Prefereces:"+ps); System.out.println("Get property1:"+ps.getInt("property1",10)); } catch (Exception err) { err.printStackTrace(); } } }
xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE preferences SYSTEM 'http://java.sun.com/dtd/preferences.dtd'> <preferences EXTERNAL_XML_VERSION="1.0"> <root type="user"> <map /> <node name="com"> <map /> <node name="mypack"> <map /> <node name="test"> <map> <entry key="property1" value="80" /> <entry key="property2" value="Red" /> </map> </node> </node> </node> </root> </preferences>
看看这篇关于偏好商店内部的文章
读取属性文件并将其内容加载到Properties
String filename = "sample.properties"; Properties properties = new Properties(); input = this.getClass().getClassLoader().getResourceAsStream(filename); properties.load(input);
以下是遍历Properties
的有效方法
for (Entry<Object, Object> entry : properties.entrySet()) { System.out.println(entry.getKey() + " => " + entry.getValue()); }
1)把你的属性文件放在classpath中是很好的,但是你可以把它放在项目的任何地方。
以下是如何从classpath加载属性文件并读取所有属性。
Properties prop = new Properties(); InputStream input = null; try { String filename = "path to property file"; input = getClass().getClassLoader().getResourceAsStream(filename); if (input == null) { System.out.println("Sorry, unable to find " + filename); return; } prop.load(input); Enumeration<?> e = prop.propertyNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); String value = prop.getProperty(key); System.out.println("Key : " + key + ", Value : " + value); } } catch (IOException ex) { ex.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } }
2)属性文件的扩展名为.properties
在Java 8中获取所有属性
public static Map<String, String> readPropertiesFile(String location) throws Exception { Map<String, String> properties = new HashMap<>(); Properties props = new Properties(); props.load(new FileInputStream(new File(location))); props.forEach((key, value) -> { properties.put(key.toString(), value.toString()); }); return properties; }
这是另一种迭代属性的方法:
Enumeration eProps = properties.propertyNames(); while (eProps.hasMoreElements()) { String key = (String) eProps.nextElement(); String value = properties.getProperty(key); System.out.println(key + " => " + value); }
去年我写了这个财产框架。 它将提供多种方式来加载属性,并强制键入。
看看http://sourceforge.net/projects/jhpropertiestyp/
JHPropertiesTyped将为开发人员提供强types属性。 易于集成到现有项目中。 由一系列的财产types处理。 赋予通过属性IO实现单行初始化属性的能力。 使开发人员能够创build自己的财产types和财产io的。 Web演示也可用,截图如上所示。 如果您select使用它,也可以使用Web前端的标准实现来pipe理属性。
完整的文档,教程,javadoc,常见问题等是在项目网页上提供。