七空幻音LOGO

七空幻音

Bukkit插件开发--基础的数据读写操作2020-02-27 14:16:51

在开发Bukkit插件时,不可避免的需要存储和读取一些数据,以下介绍一些基本的数据交换方法。

一、使用yaml

学习Bukkit插件开发时一定会学到config.ymlplugin.yml的使用

yml文件是Bukkit的配置文件格式(也是一种较为通用的配置文件格式)

yaml语法对于新手腐竹来说较为简单直观

学习yaml语法可以看这个https://www.runoob.com/w3cnote/yaml-intro.html

yml文件的读写在网上有很多,以下提供一个简单的实例

File file = new File(plugin.getDataFolder(), "example.yml");
//plugin指这个插件的主类实例
if (!file.getParentFile().exists()) { 
    // 如果父目录不存在,创建父目录(即/plugins/插件名字)
    file.getParentFile().mkdirs();
}
if (!file.exists()) {
//文件不存在则创建一个新的文件
   try {
        file.createNewFile();
        //创建文件
        Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
        //创建输出流
        writer.write("example: 233");
        //此处example的双引号可选
        //写入中文请使用双引号以免读取“半个字”出错
        writer.flush();
        writer.close();
        //向文件内写入一行“example: 233”
    }
    catch(Exception e){
        e.printStackTrace();
    }
FileConfiguration example = YamlConfiguration.loadConfiguration(file);
//读取文件
assert (int) example.get("example") == 233;

二、使用json

一般json用于数据交换,比较轻量(xml一般用于web开发)

但json最好不要用来作为配置文件,因为手动去修改时可能会出错

使用json作为配置文件的包括ColorMOTD等插件,可自行反编译查看其实现方法

json的语法请自行去网上查找,可参考https://www.runoob.com/json/json-tutorial.html

*请注意!Bukkit使用的是谷歌的gsonclassloader中不会加载一些另外的fastjson等库!

请一定使用gson去解析json!否则编译时不会出错但是一旦运行就会出现NoClassDefFoundError

如何添加gson依赖可以在网上找到

可参考https://blog.csdn.net/csdn_liumh/article/details/82893908

创建、写入json文件

        File file = new File(plugin.getDataFolder(), "example.json");
        if (!file.getParentFile().exists()) { 
        // 如果父目录不存在,创建父目录
            file.getParentFile().mkdirs();
        }
        if (!file.exists()) {
            try {
                file.createNewFile();
                Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
                Map map = new HashMap();
                map.put("Example", 233);
                //创建一个Map,加入一个键值对,键为Example,值为233
                Gson gson = new GsonBuilder().create();
                String jsonString = gson.toJson(map);
                //转换成json字符串
                //插件开发中常用的列表、Map等都可以转换成json字符串
                write.write(jsonString);
                write.flush();
                write.close();
                //写入这个json字符串
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

直接将某个对象(此处是Map)写入json文件

        Map m ;//以Map来示范
        m.put("example","another example");
        
        JSONObject jsonObject = new JSONObject(m);
        //转为json对象
        String jsonString = jsonObject.toJSONString();
        //转为json字符串
        File jsonFile = new File(plugin.getDataFolder(), "example.json");
        //注意判断文件是否存在,见上方
        //plugin是主类实例
        try {
            Writer write = new OutputStreamWriter(new FileOutputStream(jsonFile), "UTF-8");
            write.write(jsonString);
            write.flush();
            write.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

读取json文件

        File jsonFile = new File(plugin.getDataFolder(), "example.json");
        //plugin是主类实例
        JsonObject json = new JsonObject();
        try {
            json = new JsonParser().parse(new JsonReader(new FileReader(jsonFile))).getAsJsonObject();
            //使用gson的方法去简便地读取文件内容
            //鸣谢m8_mve
        } catch (Exception e) {
            e.printStackTrace();
        }
        Gson gson = new GsonBuilder().create();
        Map jsonMap = gson.fromJson(json, Map.class);
        //将json字符串转为Map

注:

json = new JsonParser().parse(new JsonReader(new FileReader(jsonFile))).getAsJsonObject();

以上这行代码鸣谢m8_mve大佬,她大大简化了我的读取操作

先前我用的是InputStream,循环读取字节并存入字符串

现在直接用gson的方法就可以搞定了,代码简洁性和效率都提升了


如果需要更强大的数据管理,那么建议使用数据库。

插件较常用的数据库是SQLite,MySQL等。这就属于进阶内容(可能我会写一篇sql基础操作也可能咕咕咕)。

最后,附上Bukkit插件开发交流群的群号,欢迎来此交流插件开发

QQ942025944



2条评论登录后可见

详细图片
载入中...