美文网首页
Bukkit插件开发教程 - 配置文件

Bukkit插件开发教程 - 配置文件

作者: Zoyn_ | 来源:发表于2018-01-13 18:18 被阅读0次

    配置文件 - Config

    注: 本章需要读者了解关于 java.io 的一些基本知识, 如 File, InputStream 的基本运用,还有 YAML 语法

    学习目标

    • 理解配置文件的意义
    • 掌握基本config.yml的使用

    理解配置文件的意义

    我们想象一个情景,你制作了一个插件,其中你设置玩家的血量为20.0,这对于生存服服主A来说是正常的,但是对于RPG服主B来说就没这么正常了,因为他的服务器的玩家的血量大多4行,但是我们不能两头都顾及,所以我们就提出配置文件的实现。

    因为我们不能让服主直接改代码(因为有些服主是没学过编程的),但是我们却可以让服主修改一个double值或一个字符串吧,所以我们就来学习关于配置文件的操作吧。

    掌握基本config.yml的使用

    讲到配置文件有不少人会想到JSON这样轻量级的数据交换格式的文件,但对于没有了解过该语法的新手服主来说未必有些困难,所以Spigot采用了YAML格式的文件(.yml)来进行读写

    我们先来看看JavaPlugin这个抽象类里面已经给我们提供了些什么东西

    public abstract class JavaPlugin extends PluginBase {
       此处省略...
        @Override
        public FileConfiguration getConfig() {
            if (newConfig == null) {
                reloadConfig();
            }
            return newConfig;
        }
    
        @SuppressWarnings("deprecation")
        @Override
        public void reloadConfig() {
            newConfig = YamlConfiguration.loadConfiguration(configFile);
    
            final InputStream defConfigStream = getResource("config.yml");
            if (defConfigStream == null) {
                return;
            }
    
            newConfig.setDefaults(YamlConfiguration.loadConfiguration(new InputStreamReader(defConfigStream, Charsets.UTF_8)));
        }
    
        @Override
        public void saveConfig() {
            try {
                getConfig().save(configFile);
            } catch (IOException ex) {
                logger.log(Level.SEVERE, "Could not save config to " + configFile, ex);
            }
        }
    
        @Override
        public void saveDefaultConfig() {
            if (!configFile.exists()) {
                saveResource("config.yml", false);
            }
        }
    }
    

    从上方的代码可以看出

    • getConfig() 获取插件文件夹里的 config.yml
    • reloadConfig() 重新加载插件文件夹里的 config.yml 至内存当中
    • saveConfig() 将内存中的 "config.yml" 的对象保存至插件文件夹中
    • saveDefaultConfig() 将jar内的 config.yml 保存至插件文件夹中

    插件文件夹: 比如我的这个插件叫 Test, 那插件文件夹就是 /plugins/Test

    那么我们就先再工作区里新建一个config.yml

    create.png

    之后我们在里面键入一些数据

    name: Zoyn
    displayName: "莫老"
    age: 666
    health: 20.0
    

    然后我们在 onEnable() 方法里面写上

        @Override
        public void onEnable() {
            getLogger().info("onEnable has been invoked!");
            // 保存config.yml至插件文件夹
            saveDefaultConfig();
        }
    

    既然我们保存好了 config.yml 那么我们要怎么用它呢?
    答案是使用 getConfig() 它返回一个 FileConfiguration 的对象, 那么我们试试在onEnable里面getConfig()

        @Override
        public void onEnable() {
            getLogger().info("onEnable has been invoked!");
            // 保存config.yml至插件文件夹
            saveDefaultConfig();
            FileConfiguration config = getConfig();
            getLogger().info("name: " + config.getString("name"));
            getLogger().info("displayName: " + config.getString("displayName"));
            getLogger().info("age: " + config.getInt("age"));
            getLogger().info("health: " + config.getDouble("health"));
        }
    

    执行了上方的代码后我们来看看控制台里面提示了些什么


    EU.png

    若此处你出现了类似 displayName: ??? 的问题, 请将config.yml 文件转为 UTF - 8无BOM 编码

    相信上方的代码已经让你知道了配置文件的基本用法了
    之后 FileConfiguration 里也包装了许许多多的方法供我们使用, 比如像 getStringList(), get() 等方法
    那么我们不能只是做读取的操作,我们也需要写入的操作

    写入要怎么写?

    config.set(键名, 对象引用);
    比如我们想在刚才的config.yml里面再添加一些内容, 我们可以这样写

      config.set("id", 1);
      config.set("QQ", 602723113);
    

    但是我们就这样去运行它,我们会发现 config.yml 并没有发生变化,这是为什么呢?
    其实我们调用 set() 方法时我们只是去设置了 config.yml 在内存当中的数据,要想写入文件我们可以使用
    JavaPlugin 已经造好的轮子 saveConfig()

    完整代码
        @Override
        public void onEnable() {
            getLogger().info("onEnable has been invoked!");
            // 保存config.yml至插件文件夹
            saveDefaultConfig();
            FileConfiguration config = getConfig();
            getLogger().info("name: " + config.getString("name"));
            getLogger().info("displayName: " + config.getString("displayName"));
            getLogger().info("age: " + config.getInt("age"));
            getLogger().info("health: " + config.getDouble("health"));
            getLogger().info("开始写入数据...");
            config.set("qq", 602723113);
            config.set("email", "602723113@qq.com");
            // 下方则是去保存内存当中的数据至 config.yml
            saveConfig();
        }
    

    之后我们就可以在config.yml里面看到以下内容

    name: Zoyn
    displayName: "莫老"
    age: 666
    health: 20.0
    qq: 602723113
    email: 602723113@qq.com
    

    相关文章

      网友评论

          本文标题:Bukkit插件开发教程 - 配置文件

          本文链接:https://www.haomeiwen.com/subject/hykynxtx.html