Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.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中合并两个Config.yml文件?_Java_Yaml_Minecraft_Bukkit - Fatal编程技术网

在Java中合并两个Config.yml文件?

在Java中合并两个Config.yml文件?,java,yaml,minecraft,bukkit,Java,Yaml,Minecraft,Bukkit,在编写我的bukkit插件时,我意识到我需要有自己的配置文件,以便可以在文件中添加注释。我还需要能够更新配置(如果它已经创建并且是旧的) 我最近还完成了一个简单的jQuery插件,我使用了jQuery.extend,并合并了两个设置数组。我想知道这在java中是否可以通过配置文件实现 我的问题: 有没有办法将新的默认配置与用户已有的配置合并?(删除不需要的值或更改相同字符串的名称) 问题的解释: 下面是我可能拥有的config.yml示例: # Comment here.... myStrin

在编写我的bukkit插件时,我意识到我需要有自己的配置文件,以便可以在文件中添加注释。我还需要能够更新配置(如果它已经创建并且是旧的)

我最近还完成了一个简单的jQuery插件,我使用了
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.