如何使用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加载文件,传入InputStreamStreamReader 。(如果使用的是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文件:

  1. 将文件存储在相同的包中。
  2. 推荐.properties扩展,但是你可以select你自己的。
  3. 使用位于java.util package => PropertiesListResourceBundleResourceBundle类的这些类。
  4. 要读取属性,请使用迭代器或枚举器,或使用Propertiesjava.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); 

为了:

  1. 您可以将文件存储在任何地方。
  2. 没有扩展是必要的。
  3. 蒙特克里斯托已经说明了如何加载这个。 这应该工作得很好。
  4. 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的数据:

  1. 布尔
  2. 浮动
  3. INT
  4. 字节数组

要加载属性文件,可以提供绝对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,常见问题等是在项目网页上提供。