Java 如何跳转到属性文件的某个部分?
标题真的说明了一切。我有一个属性文件,其中有许多不同的属性用于不同的事情:Java 如何跳转到属性文件的某个部分?,java,properties,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部分,而不必遍历文件并检查键值 有办法做到这一
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部分,而不必遍历文件并检查键值
有办法做到这一点吗
干杯
内森不做你想做的事
是否尝试检索其键以给定字符串开头的所有值?不符合您的要求
是否尝试检索其键以给定字符串开头的所有值?否
嗯,我至少需要15个字符来发布。。。那么,让我们进一步讨论答案
我看不出有什么问题。Java没有神奇的方法来猜测您的信息在哪里。除非文件的权重为数兆字节,否则加载整个文件(正如属性所做的那样,或者我认为是这样),或者消除不需要的数据(从生成的哈希表中),应该不会花费那么多时间。更糟糕的是,如果内存是一个问题,那么每行手动解析它,应该不难,而且应该仍然非常快
如果内存不是问题,那么使用propertyNames()提供的枚举循环,并检查给定字符串的键startWith()也不会花费太多时间。否
嗯,我至少需要15个字符来发布。。。那么,让我们进一步讨论答案
我看不出有什么问题。Java没有神奇的方法来猜测您的信息在哪里。除非文件的权重为数兆字节,否则加载整个文件(正如属性所做的那样,或者我认为是这样),或者消除不需要的数据(从生成的哈希表中),应该不会花费那么多时间。更糟糕的是,如果内存是一个问题,那么每行手动解析它,应该不难,而且应该仍然非常快
如果内存不是问题,则使用propertyNames()提供的枚举循环,并检查给定字符串的键startWith()也不会花费太多时间。您应该加载属性,然后可以通过其键获取值:
Properties props = new Properties();
props.load(new FileInputStream("my.properties"));
props.getProperty("ui.outputtype.snapshot");
您应该加载属性,然后可以通过其键获取值:
Properties props = new Properties();
props.load(new FileInputStream("my.properties"));
props.getProperty("ui.outputtype.snapshot");
由于类中没有节的概念,因此必须想出某种方法来查找所需的属性文件的节 一种可能的方法是获取密钥的名称,并找到包含所需前缀的密钥 这就像在属性的键上应用过滤器,然后选择所需的键。在这种情况下,我们可以将前缀视为属性文件中以点分隔的条目 下面是一个小示例代码来演示总体思路:
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));
}
}
(代码不是很令人愉快,因为属性不是泛化的。)
输出:
hello.world, 42
hello.earth, 1
在上面的示例中,该方法没有从外部属性文件加载条目,但可以使用该方法轻松实现,如前面在其他答案中所述
稍微有点不同的方法,通过所需前缀过滤键,然后可以通过简单的for
循环读取信息
下面是一个使用来自的方法的示例,该方法可以按特定的顺序过滤a。过滤后的结果(具有所需前缀的密钥)将提供给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));
}
Properties p=新属性();
p、 放置(“你好,世界”,“42”);
p、 放置(“你好,地球”,“1”);
p、 put(“abc.def”,“3”);
p、 put(“定义ghi”、“5”);
for(对象propKey:Collections2.filter(p.keySet(),new Predicate()){
公共布尔应用(对象o){
return((String)o.startsWith(“hello”);
}
}))
{
字符串键=(字符串)propKey;
System.out.println(key+”,“+p.getProperty(key));
}
这可能有点过分,但这是实现过滤器的另一种方法,可以使用所需的键缩小属性范围。由于类中没有节的概念,因此必须想出某种方法来查找所需的属性文件节
一种可能的方法是获取密钥的名称,并找到包含所需前缀的密钥
这就像在属性的键上应用过滤器,然后选择所需的键。在这种情况下,我们可以将前缀视为属性文件中以点分隔的条目
下面是一个小示例代码来演示总体思路:
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));
}
}
(代码不是很令人愉快,因为属性不是泛化的。)
输出:
hello.world, 42
hello.earth, 1
在上面的示例中,该方法没有从外部属性文件加载条目,但可以使用该方法轻松实现,如前面在其他答案中所述
稍微有点不同的方法,通过所需前缀过滤键,然后可以通过简单的for
循环读取信息
下面是一个使用来自的方法的示例,该方法可以按特定的顺序过滤a。过滤后的结果(具有所需前缀的密钥)将提供给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));
}
Properties p=新属性();
p、 放置(“你好,世界”,“42”);
p、 放置(“你好,地球”,“1”);
p、 put(“abc.def”,“3”);
p、 put(“定义ghi”、“5”);
for(对象propKey:Collections2.filter(p.keySet(),new Predicate()){
公共布尔应用(对象o){
return((String)o.startsWith(“hello”);
}
}))
{
字符串键=(字符串)propKey;
System.out.println(key+”,“+p.getProperty(key));
}
这可能有点过分,但这是实现过滤器的另一种方法,可以使用所需的键缩小属性范围。这是一个奇怪的要求。如果您担心性能问题,那么在打包之前不要在运行时打包
一个简单的例子:
cat settings.properties | grep ui.outputtype > mysmaller.properties
应该够了 这是一个奇怪的要求。如果你有