如何跳转到属性文件的某个部分?

时间:2009-09-25 15:45:33

标签: java properties

标题真的说明了一切。我有一个属性文件,其中包含许多不同的属性:

ui.datasource.st.name=MyTest
ui.datasource.st.port=111
ui.datasource.st.ip=1.1.1.1
ui.outputtype.snapshot=Snapshot
ui.outputtype.spreadsheet=Spreadsheet - xls

该文件比这大得多,我想跳转到ui.outputtype部分而不循环遍历文件并检查键值。

有办法做到这一点吗?

干杯 森

7 个答案:

答案 0 :(得分:4)

您应该加载属性,然后您可以通过其键获取值:

Properties props = new Properties();
props.load(new FileInputStream("my.properties"));

props.getProperty("ui.outputtype.snapshot");

答案 1 :(得分:2)

由于Properties类中没有部分的概念,因此需要找到一些方法来查找属性的部分想要的文件。

一种可能的方法是获取Set个密钥,并找到包含所需前缀的密钥。

这就像在属性的键上应用过滤器并挑选出所需的键。在这种情况下,我们可以将前缀视为属性文件中以点分隔的条目。

这里有一些示例代码来演示整体构思:

Properties p = new Properties();
p.put("hello.world", "42");
p.put("hello.earth", "1");
p.put("abc.def", "3");
p.put("def.ghi", "5");

// Go through the keys in the property.
for (Object propKey : p.keySet()) {
  String key = (String)propKey;

  // Select the keys with the prefix "hello."
  if (key.startsWith("hello.")) {
    System.out.println(key + ", " + p.getProperty(key));
  }
}

(代码不是很令人愉快,因为Properies没有通用化。)

输出:

hello.world, 42
hello.earth, 1

在上面的示例中,没有加载外部属性文件中的条目,但可以使用Properties.load方法轻松实现,如前面在其他答案中所述。


一种不同的方法,其中键被所需的前缀过滤,然后可以通过简单的for循环读取信息。

以下是使用Collections2.filter中的Google Collections方法的示例,该方法可以按某个Collection过滤Predicate。过滤后的结果(具有所需前缀的键)将被赋予for循环,以获取键和值对:

Properties p = new Properties();
p.put("hello.world", "42");
p.put("hello.earth", "1");
p.put("abc.def", "3");
p.put("def.ghi", "5");

for (Object propKey : Collections2.filter(p.keySet(), new Predicate<Object>() {
  public boolean apply(Object o) {
    return ((String)o).startsWith("hello.");
  }
}))
{
  String key = (String) propKey;
  System.out.println(key + ", " + p.getProperty(key));
}

这可能有点矫枉过正,但这是实现过滤器以使用所需键缩小属性的另一种方法。

答案 2 :(得分:2)

您可以覆盖Java Properties类以在属性文件中实现部分处理:

@Override
public synchronized Object put(Object key, Object value) {
    String sKey = key.toString();
    if (sKey.startsWith("[") && sKey.endsWith("]"))

完整示例位于: http://devsite.pl/blog.2011-06-25.java_ini_sections.html

答案 3 :(得分:1)

Properties.getProperty(String key)不能做你想做的事吗?

您是否尝试检索其键以给定字符串开头的所有值?

答案 4 :(得分:1)

抱歉没有尽快放弃 - 我在这里没有意识到任何评论/答案。

基本上我的属性文件中有'部分'是由同事开发的,我在考虑每个'部分'一个文件。无论如何,我对这一切的运作方式的理解正在逐渐增长,我想出的是:

for(String key : props.stringPropertyNames())
    {
        // Jump to the relevant section of a properties file
        if(key.contains("datamode"))
        {
            OptionItem oi = new OptionItem(key, props.getProperty(key));
            // String value = props.getProperty(key);
            this.cbo_mode.add(oi);
        }
    }

感谢您的所有帮助和建议。 森

答案 5 :(得分:0)

没有

嗯,我需要至少15个字符发布...所以让我们扩展答案。

我没有看到问题。 Java没有神奇的方法来猜测你的信息在哪里。除非文件加权几兆字节,否则整个加载(如属性所做,或者我认为),也许消除你不需要的数据(来自生成的哈希表),不应该花费那么多时间。更糟糕的是,如果内存是一个问题,每行手动解析它,不应该很难,应该仍然很快。

如果内存不是问题,使用propertyNames()提供的枚举循环并检查键startWith()给定的字符串也不会花费太多时间。

答案 6 :(得分:0)

这是一个奇怪的要求。如果您担心性能,那么在不在运行时打包之前执行此操作。

简单:

cat settings.properties | grep ui.outputtype > mysmaller.properties

应该足够了!