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

配置文件 - 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342