配置加载器

让我们分解 Configurate 的整个工作流程,从加载开始。 Configurate 提供了 ConfigurationLoader 用于常见的配置格式,并用于管理物理上的配置文件,允许你通过给定资源读取或存储数据。它们还允许你加载空配置,并给予你权利去指定硬编码的默认值,或者从一个已经写好的文件指定默认值。

获取配置加载器

備註

默认的 ConfigurationLoader 用于 HOCON 格式的配置。请参见 插件配置 页面的相关内容。

首先,让我们新建一个 HoconConfigurationLoader 并指向我们的配置文件。

import java.nio.file.Path;
import ninja.leaping.configurate.commented.CommentedConfigurationNode;
import ninja.leaping.configurate.hocon.HoconConfigurationLoader;
import ninja.leaping.configurate.loader.ConfigurationLoader;

Path potentialFile = getConfigPath();
ConfigurationLoader<CommentedConfigurationNode> loader =
  HoconConfigurationLoader.builder().setPath(potentialFile).build();

配置加载器同时会存有一个泛型以决定其会构建什么样的节点类型。关于节点,也就是 Configuration Nodes 的内容,会在 稍后的章节 中加以阐述。

ConfigurationLoader 通常持有一个生成器( Builder )用于静态地访问和创建一个你想要的类型的新加载器。对于基本的配置,我们并不需要指定除了我们想要加载和保存的文件之外的其他东西。因此,我们需要做的全部事情就是使用 HoconConfigurationLoader.builder().setPath(path) 。然后我们通过生成器生成( build() )了一个实例并将其存储在了一个变量里。

当然,这并不是加载文件的唯一方法。生成器还有一个名为 setURL(URL) 的方法,在万一你想要加载的资源不使用 Path 的情况下。铭记从 URL 中创建的配置加载器是只读的,因为它们没有办法把数据写回 URL 。

这一功能可以用于把你的插件 JAR 中的一个文件绑定到默认的配置上,然后将其作为初始化时的配置文件以供服务器管理员(或者插件本身)修改。

加载和保存

当你获取到了 ConfigurationLoader ,就可以通过 createEmptyNode() 方法来获取一个空的 ConfigurationNode

import ninja.leaping.configurate.ConfigurationNode;
import ninja.leaping.configurate.ConfigurationOptions;

Path potentialFile = getConfigPath();
ConfigurationLoader<CommentedConfigurationNode> loader = HoconConfigurationLoader.builder().setPath(potentialFile).build();
ConfigurationNode rootNode = loader.createEmptyNode(ConfigurationOptions.defaults());

这个方法期望一个 ninja.leaping.configurate.ConfigurationOptions 作为参数。除非你有想要使用的特性,如自定义类型的序列化方式,否则你直接使用 ConfigurationOptions#defaults() 来创建这个参数作为默认值就可以了。

可以通过使用 load() 方法在 ConfigurationLoader 创建时从指定的源加载配置内容。当然它也需要一个 ConfigurationOptions 的实例,而且同时提供一个等价于 load(ConfigurationOptions.defaults()) 的简写形式。

import java.io.IOException;

Path potentialFile = getConfigPath();
ConfigurationLoader<CommentedConfigurationNode> loader = HoconConfigurationLoader.builder().setPath(potentialFile).build();
ConfigurationNode rootNode;
try {
    rootNode = loader.load();
} catch(IOException e) {
    // error
}

如果给定的 Path 不存在,那么 load() 方法将会创建一个空的 ConfigurationNode 。任何可能的错误都将会抛出一个 IOException ,因此你需要对其进行妥善处理。

如果你使用了默认的配置加载器,我们建议你获取相应的 ConfigurationOptions 对象,因为你可以通过它序列化 Sponge 中出现的绝大部分对象。

一旦你修改了你的 ConfigurationNode 并想要保存修改过的数据,你可以通过 ConfigurationLoader 保存你的节点至你初始化时设置的文件中。如果这么一个文件不存在,那么它将被创建,如果存在,那么它将被覆盖。

try {
    loader.save(rootNode);
} catch(IOException e) {
    // error
}

再一次地,所有的错误都会抛出一个 IOException ,同时你必须处理它。

示例:从插件的 JAR 中加载默认配置

import java.net.URL;

URL jarConfigFile = Sponge.getAssetManager().getAsset("defaultConfig.conf").get().getUrl();
ConfigurationLoader<CommentedConfigurationNode> loader =
  HoconConfigurationLoader.builder().setURL(jarConfigFile).build();

在这一示例中需要着重注意的一点是,方法 AssetManager#getAsset(String) 的返回值取决于插件的 Asset 文件夹位置。因此,如果上面的示例中的插件 ID 为 myplugin ,那么相应的 defaultConfig.conf 可能会位于 JAR 的根目录位置,而不是位于 assets/myplugin 目录下。更多信息可以参见 Asset API 的相关页面。