Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何跳转到属性文件的某个部分?_Java_Properties - Fatal编程技术网

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

应该够了

这是一个奇怪的要求。如果你有