标题真的说明了一切。我有一个属性文件,其中包含许多不同的属性:
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部分而不循环遍历文件并检查键值。
有办法做到这一点吗?
干杯 森
答案 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
应该足够了!