配置文件 - Config
注: 本章需要讀者了解關(guān)于 java.io 的一些基本知識(shí), 如 File, InputStream 的基本運(yùn)用急膀,還有 YAML 語(yǔ)法
學(xué)習(xí)目標(biāo)
- 理解配置文件的意義
- 掌握基本config.yml的使用
理解配置文件的意義
我們想象一個(gè)情景,你制作了一個(gè)插件浇衬,其中你設(shè)置玩家的血量為20.0妓柜,這對(duì)于生存服服主A來(lái)說(shuō)是正常的,但是對(duì)于RPG服主B來(lái)說(shuō)就沒(méi)這么正常了暇番,因?yàn)樗姆?wù)器的玩家的血量大多4行噩翠,但是我們不能兩頭都顧及,所以我們就提出配置文件的實(shí)現(xiàn)言沐。
因?yàn)槲覀儾荒茏尫髦苯痈拇a(因?yàn)橛行┓魇菦](méi)學(xué)過(guò)編程的)邓嘹,但是我們卻可以讓服主修改一個(gè)double值或一個(gè)字符串吧,所以我們就來(lái)學(xué)習(xí)關(guān)于配置文件的操作吧险胰。
掌握基本config.yml的使用
講到配置文件有不少人會(huì)想到JSON這樣輕量級(jí)的數(shù)據(jù)交換格式的文件汹押,但對(duì)于沒(méi)有了解過(guò)該語(yǔ)法的新手服主來(lái)說(shuō)未必有些困難,所以Spigot采用了YAML格式的文件(.yml)來(lái)進(jìn)行讀寫(xiě)
我們先來(lái)看看JavaPlugin這個(gè)抽象類(lèi)里面已經(jīng)給我們提供了些什么東西
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 至內(nèi)存當(dāng)中
- saveConfig() 將內(nèi)存中的 "config.yml" 的對(duì)象保存至插件文件夾中
- saveDefaultConfig() 將jar內(nèi)的 config.yml 保存至插件文件夾中
插件文件夾: 比如我的這個(gè)插件叫 Test, 那插件文件夾就是 /plugins/Test
那么我們就先再工作區(qū)里新建一個(gè)config.yml
之后我們?cè)诶锩骀I入一些數(shù)據(jù)
name: Zoyn
displayName: "莫老"
age: 666
health: 20.0
然后我們?cè)?onEnable() 方法里面寫(xiě)上
@Override
public void onEnable() {
getLogger().info("onEnable has been invoked!");
// 保存config.yml至插件文件夾
saveDefaultConfig();
}
既然我們保存好了 config.yml 那么我們要怎么用它呢?
答案是使用 getConfig() 它返回一個(gè) FileConfiguration 的對(duì)象, 那么我們?cè)囋囋趏nEnable里面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"));
}
執(zhí)行了上方的代碼后我們來(lái)看看控制臺(tái)里面提示了些什么
若此處你出現(xiàn)了類(lèi)似 displayName: ??? 的問(wèn)題, 請(qǐng)將config.yml 文件轉(zhuǎn)為 UTF - 8無(wú)BOM 編碼
相信上方的代碼已經(jīng)讓你知道了配置文件的基本用法了
之后 FileConfiguration 里也包裝了許許多多的方法供我們使用, 比如像 getStringList(), get() 等方法
那么我們不能只是做讀取的操作起便,我們也需要寫(xiě)入的操作
寫(xiě)入要怎么寫(xiě)?
config.set(鍵名, 對(duì)象引用);
比如我們想在剛才的config.yml里面再添加一些內(nèi)容, 我們可以這樣寫(xiě)
config.set("id", 1);
config.set("QQ", 602723113);
但是我們就這樣去運(yùn)行它棚贾,我們會(huì)發(fā)現(xiàn) config.yml 并沒(méi)有發(fā)生變化,這是為什么呢榆综?
其實(shí)我們調(diào)用 set() 方法時(shí)我們只是去設(shè)置了 config.yml 在內(nèi)存當(dāng)中的數(shù)據(jù)妙痹,要想寫(xiě)入文件我們可以使用
JavaPlugin 已經(jīng)造好的輪子 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("開(kāi)始寫(xiě)入數(shù)據(jù)...");
config.set("qq", 602723113);
config.set("email", "602723113@qq.com");
// 下方則是去保存內(nèi)存當(dāng)中的數(shù)據(jù)至 config.yml
saveConfig();
}
之后我們就可以在config.yml里面看到以下內(nèi)容
name: Zoyn
displayName: "莫老"
age: 666
health: 20.0
qq: 602723113
email: 602723113@qq.com