访问多个 YAML 文件

Accessing multiple YAML files

所以,在过去的 5 个小时里,我一直在摆弄这个问题,我似乎无法弄清楚为什么我无法访问我的第二个 yaml 文件。我一直在搜索 google 寻找答案,但仍然没有找到任何与我正在寻找的东西有一点相似的东西。现在,在您问我是否已将其注册到 onEnable 事件之前,我已经注册了。 config.yml 文件工作得很好,正如我需要的那样。但是,当我创建第二个 yaml 文件“blocks.yml”时,我无法访问这些函数,例如: 我需要将数据放入 blocks.yml 文件,但是使用 plugin.data.getBlocks().contains(...) .contains() 部分显示错误,当我删除 .contains() 部分时,我唯一的选择是plugin.data.getBlocks() 部分是 trylambda 事件。老实说,我对此非常困惑。我什至在没有 plugin.data.getBlocks() 行的 .data 部分的情况下尝试过它,但它完全没有显示 getBlocks()。这是我的配置管理器文件;


import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ConfigManager {

    private main plugin;
    private FileConfiguration config;
    private File configFile;

    private FileConfiguration blocks;
    private File blocksFile;

    public ConfigManager(main plugin) {
        this.plugin = plugin;
    }

    public void reloadConfig() {
        if (configFile == null) {
            configFile = new File(plugin.getDataFolder(), "config.yml");
        }
        config = YamlConfiguration.loadConfiguration(configFile);
        InputStream defaultStream = plugin.getResource("config.yml");
        if (defaultStream != null) {
            YamlConfiguration defaultConfig = YamlConfiguration.loadConfiguration(new InputStreamReader(defaultStream));
            config.setDefaults(defaultConfig);
        }
    }

    public void getConfig() {
        if (config == null) {
            reloadConfig();
        }
    }
    public void saveConfig() {
        if(config == null || configFile == null) {
            return;
        }
        try {
            config.save(configFile);
        } catch (IOException e) {
            plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "Could not save config to " + this.configFile, e.toString());
        }
    }
    public void saveDefaultConfig() {
        if(configFile == null) {
            configFile = new File(plugin.getDataFolder(), "config.yml");
        }
        if(!configFile.exists()) {
            plugin.saveResource("plugin.yml", false);
        }
    }

    public void reloadBlocks() {
        if (blocksFile == null) {
            blocksFile = new File(plugin.getDataFolder(), "blocks.yml");
        }
        blocks = YamlConfiguration.loadConfiguration(blocksFile);
        InputStream defaultBlocksStream = plugin.getResource("blocks.yml");
        if (defaultBlocksStream != null) {
            YamlConfiguration defaultBlocks = YamlConfiguration.loadConfiguration(new InputStreamReader(defaultBlocksStream));
            blocks.setDefaults(defaultBlocks);
        }
    }

    public void getBlocks() {
        if (blocks == null) {
            reloadBlocks();
        }
    }
    public void saveBlocks() {
        if(blocks == null || blocksFile == null) {
            return;
        }
        try {
            blocks.save(blocksFile);
        } catch (IOException e) {
            plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "Could not save blocks to " + this.blocksFile, e.toString());
        }
    }
    public void saveDefaultBlocks() {
        if(blocksFile == null) {
            blocksFile = new File(plugin.getDataFolder(), "blocks.yml");
        }
        if(!blocksFile.exists()) {
            plugin.saveResource("blocks.yml", false);
        }
    }
}

有很多话要说。

你的方法getBlocks()return“无效”,所以什么都没有。你应该这样做:

public FileConfiguration getBlocks() {
    if (blocks == null) {
        reloadBlocks();
    }
    return blocks;
}

此外,JavaPlugin 的 class 已经实现了 saveConfig() & saveDefaultConfig() 方法。您不必自己复制它们。这样做 :

plugin.saveDefaultConfig(); // copy if not found
plugin.getConfig().set("a", "b");
plugin.saveConfig(); // save config

老实说,问题的描述对你帮助不大。

根据您的设计模式,我发现方法 saveDefaultConfigsaveDefaultBlocks 之间存在差异。

考虑到这个方法,我建议您将上一条命令 plugin.saveResource("blocks.yml", false); 更改为 plugin.saveResource("plugin.yml", false);

此外,方法 contains 不在您在问题中添加的代码片段中。尝试在项目文件中搜索单词 contains,因为错误可能与此命令有关。可能您在不包含此类方法的对象上使用此命令。

更新

将方法 getBlocks 更改为,

public YamlConfiguration getBlocks() {
    if (blocks == null) {
        reloadBlocks();
    }
    return blocks;
}