在Java中合并两个Config.yml文件?
在编写我的bukkit插件时,我意识到我需要有自己的配置文件,以便可以在文件中添加注释。我还需要能够更新配置(如果它已经创建并且是旧的) 我最近还完成了一个简单的jQuery插件,我使用了在Java中合并两个Config.yml文件?,java,yaml,minecraft,bukkit,Java,Yaml,Minecraft,Bukkit,在编写我的bukkit插件时,我意识到我需要有自己的配置文件,以便可以在文件中添加注释。我还需要能够更新配置(如果它已经创建并且是旧的) 我最近还完成了一个简单的jQuery插件,我使用了jQuery.extend,并合并了两个设置数组。我想知道这在java中是否可以通过配置文件实现 我的问题: 有没有办法将新的默认配置与用户已有的配置合并?(删除不需要的值或更改相同字符串的名称) 问题的解释: 下面是我可能拥有的config.yml示例: # Comment here.... myStrin
jQuery.extend
,并合并了两个设置数组。我想知道这在java中是否可以通过配置文件实现
我的问题:
有没有办法将新的默认配置与用户已有的配置合并?(删除不需要的值或更改相同字符串的名称)
问题的解释:
下面是我可能拥有的config.yml示例:
# Comment here....
myString: defaultString
myBool: false
myList:
- Value
- Value 2
很简单。假设这是我的默认配置。插件已将此配置(如果尚未存在)复制到插件文件夹中。但是,这带来了一个问题:
如果我需要更新配置怎么办?(添加/删除布尔值、字符串等)
有一天,我说“我不再需要布尔值myBool
”。我将其从默认config.yml中删除,配置如下所示:
# Comment here....
myString: defaultString
myList:
- Value
- Value 2
或者,我可能需要添加一个额外的字符串myNewString
:
# Comment here....
myString: defaultString
myNewString: string
myList:
- Value
- Value 2
如果我将配置yml重写为新的“默认”配置文件,我将丢失所有用户的配置设置
是否有一种方法可以将新的默认配置与用户已有的配置合并,只需添加带有默认值的新字符串?
Bukkit有一个内置类,其中包含一些方法,允许您获取一个值或指定一个默认值以在不存在时检索,例如
按路径获取请求的字符串,如果找不到,则返回默认值
如果字符串不存在,则将返回指定的默认值,无论是否在根配置中标识了默认值
但是,它无法从配置中删除值。如果新配置与前一个配置有很大不同,您可以考虑创建新的配置,删除旧的,并重新命名新的,以取代它的位置。尽管我不会太在意它,除非它有显著的不同。如果您使用的是Spring,那么您可以使用
YamlPropertiesFactoryBean
。它内置了读取多个yaml文件并将它们合并在一起的支持。这样,您就可以从yaml文件中获得合并的Map
。然后,如果您愿意,可以使用ObjectMapper
将其转换为特定类型
例如
YamlMapFactoryBean工厂=新的YamlMapFactoryBean();
factory.setResolutionMethod(ResolutionMethod.OVERRIDE_和_IGNORE);
setResources(…资源);
Map yamlValueMap=factory.getObject();
如果提供了多个资源,则后面的资源将覆盖中的条目
早期的等级制度;也就是说,具有相同嵌套键的所有条目
合并任意深度的{@code Map}类型。例如:
<pre class="code">
foo:
bar:
one: two
three: four
</pre>
plus (later in the list)
<pre class="code">
foo:
bar:
one: 2
five: six
</pre>
results in an effective input of
<pre class="code">
foo:
bar:
one: 2
three: four
five: six
</pre>
Note that the value of "foo" in the first document is not simply replaced
with the value in the second, but its nested values are merged.
傅:
酒吧:
一:二
三:四
加(列表后面)
傅:
酒吧:
一:二
五点六分
结果有效地输入了
傅:
酒吧:
一:二
三:四
五点六分
请注意,第一个文档中的“foo”值并不是简单地替换的
与第二个中的值合并,但其嵌套值合并。
我说的是一个已经制作好的config.yml插件更新时,插件会检查配置,然后将插件中的默认config.yml与当前的配置合并。@EliteGamer是的,加载默认配置,然后使用您的配置作为默认值
参数加载用户的配置。@MrLove两次加载同一配置是否不好?就资源而言,这似乎是浪费。想想看,我可以只创建一个函数。谢谢
<pre class="code">
foo:
bar:
one: two
three: four
</pre>
plus (later in the list)
<pre class="code">
foo:
bar:
one: 2
five: six
</pre>
results in an effective input of
<pre class="code">
foo:
bar:
one: 2
three: four
five: six
</pre>
Note that the value of "foo" in the first document is not simply replaced
with the value in the second, but its nested values are merged.