純規の暇人趣味ブログ

手を突っ込んで足を洗う

[Bukkitプラグイン制作講座-其之八]複数のymlファイルを扱う

      2016/12/13    HimaJyun

前回の記事ではconfig.ymlを利用した設定のセーブやロード、ちょっとした便利な使い方などをご紹介しました。

今回はconfig.yml以外にも、複数のymlファイルを取り扱う方法をご紹介しようと思います。

前回の記事は「[Bukkitプラグイン制作講座-其之七]config.ymlを扱う」です。

また、実際のコードはGitHubにおいてあります。

複数の設定ファイル

ところでみなさん、気になりませんか?

プラグインによっては、config.yml以外の設定ファイルも取り扱えるようになっています。

しかし、Bukkitにはその様な機能は存在していません、どのようにすれば良いのでしょうか?

簡単です、Bukkitの機能を模倣した機能を用意すれば良いのです。

模倣版yml操作クラス

今回は、Bukkitがymlを操作する手順を模倣して、同じ事がconfig.yml以外でも出来るCustomConfigクラスを作成しようと思います。

と言う訳で、とりあえずコンストラクタまでは以下の様な感じで

public class CustomConfig {

	private FileConfiguration config = null;
	private final File configFile;
	private final String file;
	private final Plugin plugin;

	public CustomConfig(Plugin plugin) {
		this(plugin, "config.yml");
	}

	public CustomConfig(Plugin plugin, String fileName) {
		this.plugin = plugin;
		this.file = fileName;
		configFile = new File(plugin.getDataFolder(), file);
	}
}

単純に引数で受け取った情報を変数にしまい込んでいるだけですね。

引数が一つの方のコンストラクタの「this()」は同クラスの別のコンストラクタを呼び出すやり方です。

ファイル名が省略されているときにconfig.ymlを使用するようにしています。

saveDefaultConfig()

これはBukkitのコードをそのままにパクれば真似すれば可能です。

public void saveDefaultConfig() {
	if (!configFile.exists()) {
		plugin.saveResource(file, false);
	}
}

existsメソッドでファイルが存在しているかを確認し、存在していない場合はファイルに保存する。

saveResourceはプラグイン(jar)に含まれているファイルを保存するBukkitの機能です。

第二引数をtrueにすれば、ファイルが存在しても上書きする仕様ですが、その挙動は危険なのでfalseで

……第二引数がfalseならexistsは要らない気がしますけどね、Bukkitがそうなっているので合わせておきましょう。

reloadConfig()

解説の都合から、先にreloadConfig()を説明しましょう。

public void reloadConfig() {
	config = YamlConfiguration.loadConfiguration(configFile);

	final InputStream defConfigStream = plugin.getResource(file);
	if (defConfigStream == null) {
		return;
	}

	config.setDefaults(YamlConfiguration.loadConfiguration(new InputStreamReader(defConfigStream, StandardCharsets.UTF_8)));
}

YamlConfigurationのloadConfigurationで設定ファイルをロードしています。

次に、getResourceと言うこれまたjarに含まれるファイルを取得できるBukkitの機能を利用しています。

これの取得結果を元に、setDefaultsでデフォルトの設定を行っている訳ですね。

ちなみに、StandardCharsets.UTF_8の部分はBukkitではCharsets.UTF_8になっています。

Charsets.UTF_8はGoogleのライブラリ、StandardCharsets.UTF_8はJava7からの機能で、どちらも中身はCharset.forName("UTF-8")です。

作成しているプラグインがJava6に対応する必要がある場合のみ気を付けて下さい。

getConfig()

超シンプル設計です。

public FileConfiguration getConfig() {
	if (config == null) {
		reloadConfig();
	}
	return config;
}

configがnullの時だけreloadConfig()を読んでいる、たったそれだけですね。

つまり、getConfig()の本質はreloadConfig()ってなわけです。

saveConfig()

こちらもBukkitに設定を保存する機能が備わっているので、nullチェックの後にそれを呼び出しているだけです。

public void saveConfig() {
	if (config == null) {
		return;
	}
	try {
		getConfig().save(configFile);
	} catch (IOException ex) {
		plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex);
	}
}

使ってみる

では、実際に使ってみましょう。(CustomConfigクラスの実物もGitHubにあります)

……と言っても、onEnableとかでnewすればそれだけで終わりですね。

@Override
public void onEnable() {
	config = new CustomConfig(this);
	message = new CustomConfig(this, "message.yml");

	// TODO:ここで設定ファイルを利用してゴニョゴニョする。
}

後は、「config.getConfig()」みたいにして設定をロードするだけ。

簡単ですね。

最後に

……記事にしてみたら中身がうす~い!!

割とハマる話題のクセに解説してみると中身がな~い!!

と言うか、何故Bukkitにこの機能を載せないのかが謎ですね、それとも載っているけど私が気付いていないだけ?

兎にも角にも、これで複数の設定ファイルを取り扱う事が出来る様になりました、実際のコードはGitHubにおいてありますので参考にしてみて下さい。

 - プログラミング , ,