如何使用Java属性文件?

Cli*_*ote 218 java properties

我有一个配置值的键/值对列表,我想存储为Java属性文件,然后加载和迭代.

问题:

  • 我是否需要将文件存储在与将加载它们的类相同的包中,或者是否存在应放置它的任何特定位置?
  • 文件是否需要以任何特定扩展名结束或者是否.txt正常?
  • 如何在代码中加载文件
  • 我怎样才能遍历内部的值?

Zed*_*Zed 242

您可以将InputStream传递给Property,因此您的文件几乎可以在任何地方,并且可以调用任何内容.

Properties properties = new Properties();
try {
  properties.load(new FileInputStream("path/filename"));
} catch (IOException e) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

迭代为:

for(String key : properties.stringPropertyNames()) {
  String value = properties.getProperty(key);
  System.out.println(key + " => " + value);
}
Run Code Online (Sandbox Code Playgroud)

  • 这与`properties.load(PropertiesReader.class.getResourceAsStream("/ properties.properties"))相比如何; `那就是`getResourceAsStream`和`FileInputStream`?利弊? (3认同)
  • @MitakshGupta如果在文件或默认属性列表中找不到具有您传递的名称的属性,则它会返回"null".参见[Javadoc](http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#getProperty%28java.lang.String%29) (2认同)

Jon*_*eet 79

  • 可以将文件存储在任何您喜欢的位置.如果要将其保存在jar文件中,则需要使用Class.getResourceAsStream()ClassLoader.getResourceAsStream()访问它.如果它在文件系统上,则稍微容易一些.

  • 任何扩展都没问题,尽管.properties在我的经验中更常见

  • 如果您正在使用Java 6,使用Properties.load传入InputStream或传入文件来加载文件StreamReader.(如果您使用的是Java 6,我可能会使用UTF-8而不是默认的ISO-8859-1编码用于流. )Reader

  • 当你迭代正常Hashtable(Properties源自)时,迭代它,例如使用keySet().或者,您可以使用返回的枚举propertyNames().


Fab*_*eeg 26

如果将属性文件放在与Foo类相同的包中,则可以轻松加载它

new Properties().load(Foo.class.getResourceAsStream("file.properties"))
Run Code Online (Sandbox Code Playgroud)

鉴于Properties扩展了Hashtable,您可以以与Hashtable中相同的方式迭代值.

如果使用*.properties扩展,则可以获得编辑器支持,例如Eclipse具有属性文件编辑器.

  • 你*可以*这样做 - 但我不喜欢在同一个包中存储属性文件.您最终会在应用程序中的所有位置传播属性文件.我宁愿将所有属性文件存储在应用程序的根目录中,并将它们加载为"class.getResourceAsStream("\ file.properties")"或在其他一些已知位置. (5认同)
  • 对于任何试图让Nate的例子工作的人来说,反斜杠应该用正斜杠代替.所以在这种情况下:'class.getResourceAsStream("/ file.properties")' (2认同)

ada*_*ost 11

有很多方法可以创建和读取properties文件:

  1. 将文件存储在同一个包中.
  2. 推荐.properties扩展,但您可以选择自己的扩展.
  3. 使用论文位于类java.util包=> ,,Properties 类.ListResourceBundleResourceBundle
  4. 要读取属性,请使用迭代器或枚举器或直接方法Propertiesjava.lang.System类.

ResourceBundle 类:

 ResourceBundle rb = ResourceBundle.getBundle("prop"); // prop.properties
 System.out.println(rb.getString("key"));
Run Code Online (Sandbox Code Playgroud)

Properties 类:

Properties ps = new Properties();
ps.Load(new java.io.FileInputStream("my.properties"));
Run Code Online (Sandbox Code Playgroud)


Alb*_*gni 5

这会加载属性文件:

Properties prop = new Properties();
InputStream stream = ...; //the stream to the file
try {
  prop.load(stream);
} finally {
  stream.close();
}
Run Code Online (Sandbox Code Playgroud)

我用.将.properties文件放在我拥有所有配置文件的目录中,我不会将它与访问它的类放在一起,但这里没有限制.

对于名称...我使用.properties来表示冗长,如果你不想要,我认为你不应该将它命名为.properties.


小智 5

例:

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);
Run Code Online (Sandbox Code Playgroud)


Rav*_*abu 5

财产已成为遗产。首选项类优先于属性。

偏好数据分层集合中的一个节点。此类允许应用程序存储和检索用户和系统首选项和配置数据。此数据永久存储在依赖于实现的后备存储中。典型的实现包括平面文件、特定于操作系统的注册表、目录服务器和 SQL 数据库。这个类的用户不需要关心后备存储的细节。

与基于字符串的键值对的属性不同,Preferences该类有多种方法用于获取原始数据并将其放入首选项数据存储中。我们只能使用以下类型的数据:

  1. 细绳
  2. 布尔值
  3. 双倍的
  4. 漂浮
  5. 整数
  6. 字节数组

要加载属性文件,您可以提供绝对路径,或者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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

看看这篇关于首选项商店内部结构的文章