大家。我刚刚开始为Minecraft编写Bukkit插件。我的前两个插件在我的服务器上运行正常,我已经有了dev版本,而且它们根本没给我带来太多麻烦。我目前正在研究第三种,我遇到了一些麻烦。
我试图弄清楚如何创建一个YAML文件并从中读取/写入数据。只是为了澄清,我不是指config.yml
文件,因为我没有遇到任何麻烦。我知道如何创建一个默认的config.yml
文件并从中读取数据,所有这些都很好,花花公子。但是,使用我的第三个插件,我需要使用单独的YAML文件。我四处寻求帮助,但我得到的答案中有95%涉及有人告诉我一些关于getConfig()
的事情,这不是我正在寻找的,或者至少我95%肯定那不是什么我在找。在寻找明确答案几周后,我决定在这里发布我的问题。一如既往,提前感谢您的帮助!
我想我已经弄明白了如何创建一个YAML文件,但之后我就陷入了困境。我只想举例说明我的情况。
假设我有以下主要课程:
package ...
import ...
//Here is my main class
public class MyClass extends JavaPlugin {
//I instantiate my File and FileConfiguration here
//Should I do this? I need them for my other classes.
public FileConfiguration myFileConfig = null;
public File myFile;
//On Enable
@Override
public void onEnable() {
//Get/Create File
myFile = new File(getDataFolder(), "myfile.yml");
if (!myFile.exists()) {
try {
myFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//Load myfily.yml file configuration
FileConfiguration myFileConfig = YamlConfiguration.loadConfiguration(myFile);
//Register my command executor class
getCommand("test").setExecutor(new myCommandExecutor());
}
//On Disable
@Override
public void onDisable() {
//Irrelevant stuff here
}
}
现在说我也有以下CommandExecutor类(星号标记重要的东西发生。我省略了所有嵌套的if
函数来节省你的时间):
package ...
import ...
public class myCommandExecutor implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (cmd.getName().equalsIgnoreCase("test")) {
if (args.length > 0) {
****************//RIGHT HERE I WOULD ADD ALL THE COMMAND ARGUMENTS
****************//IMAGINE THE FOLLOWING USAGE FOR THE COMMAND
****************//USAGE: /test <add|del> <one|two|three> <name>
****************//IF THE USER EXECUTED THE FOLLOWING, THE CODE BELOW WOULD BE THE FINAL RESULT
****************//EXECUTED: /test add two hello
YamlClass.addToFile(args[1], args[2]);
} else {
sender.sendMessage("Not enough arguments!");
}
}
}
}
在上面的示例中,如果用户键入/test add two hello
,我希望将最后两个参数(两个和hello)发送到另一个类中的方法(在此示例中,类中为addToFile(String a, String b)
YamlClass
)其中args [1]和args [2]将用于将字符串放入这样的文件中:
test:
one:
two:
- hello
three:
如果用户然后运行/test add three goodbye
,文件将如下所示:
test:
one:
two:
- hello
three:
- goodbye
如果用户然后执行/test add three test
,则会在该部分添加'test'而不替换之前添加的'goodbye'。
谁能给我一些帮助或提示如何去做这个?
谢谢!
[编辑]昨晚我发现了。我实际上正在做的一切就文件和YamlCinfiguration而言,我的CommandExecutor有问题,但我修复了它。感谢您的回复!
答案 0 :(得分:5)
一般来说,zifnab06的答案并没有错。我自己正在使用Bukkit插件,并习惯使用以下代码来处理YAML文件。
File f = new File("path/to/your/YAML/file.yml");
YamlConfiguration yamlFile = YamlConfiguration.loadConfiguration(f);
这会创建一个YamlConfiguration
的新实例,您可以使用yamlFile.set("path", new Object());
来编写值,使用yamlFile.get("path");
来读取值(您不一定需要使用createSection(String)
}事先)。可以使用的所有方法都包含在JavaDoc。
如果要保存/创建.yml文件,只需使用以下代码:
try {
yamlFile.save(f);
} catch(IOException e) {
// Handle any IO exception here
e.printStackTrace();
}
我希望这回答了你的问题;如果您需要使用某些代码,可以使用BitBucket上提供的插件源代码。
答案 1 :(得分:4)
我相信你要找的是org.bukkit.configuration.file.YamlConfiguration。 javadoc位于here。
快速示例,基于上面的示例:
YamlConfiguration yaml = new YamlConfiguration();
yaml.createSection("test");
yaml.createSection("test.one");
yaml.createSection("test.two");
List<String> values = new ArrayList<String>();
values.add("hello");
values.add("goodbye");
values.add("test");
yaml.set("test.one", values)
yaml.save('/path/to/file/location.yml');
答案 2 :(得分:0)
我个人直到现在才知道如何做到这一点,但我使用了zifnab06和mezzodrinker这两个第一个答案的组合,它很好地解决了。这就是我所拥有的:
.alert span {
vertical-align: middle;
line-height:normal;
}
.alert > div {
line-height: 34px;
}
对于任何新手,结果是在名为PermaLocs的文件夹中找到的文件名位置,该文件内部包含以下内容:
YamlConfiguration yaml = new YamlConfiguration();
yaml.createSection("test");
yaml.createSection("test.one");
yaml.createSection("test.two");
List<String> values = new ArrayList<String>();
values.add("hello");
values.add("goodbye");
values.add("test");
yaml.set("test.one", values);
try {
yaml.save("plugins/PermaLocs/Locations.yml");
} catch (IOException e) {
e.printStackTrace();
}
希望有人帮助过。 :)