Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Стартап Туториал - Работа с YAML файлами *BROKEN*

koten0k

Активный участник
Пользователь
Баллы
46
Здравствуйте все! Сегодня я хотел бы написать гайд, как работать с YAML файлами.
Нам понадобиться:
- IDE
- java
- bukkit или его форки
Давайте начнём!
У нас будет две главные переменные: file - сам файл и config - загруженные данные из файла.
Создаём файл:
Код:
public class Main extends JavaPlugin {

    private File file; //Объявляем переменные
    private FileConfiguration config;
   
    public void onEnable() {
           Plugin plugin = Bukkit.getPluginManager().getPlugin(getName()); //Получаем наш плагин
           file = new File(plugin.getDataFolder().getAbsolutePath()+"/config.yml"); //Создаем новый файл
    }
}

Теперь нужно получить данные из файла:
Код:
config = YamlConfiguration.loadConfiguration(file);

Таким же способом будем перезагружать конфиг, а сохранить его можно так:
Код:
config.save(file);

Отлично! Но что же делать, если файл не существует? Это самое сложное и интересное в этой теме: создать новый файл и наполнить данными!

В интернете предлагают такой способ:
Код:
if (!file.exists()) {
    file.createNewFile();
}
Дальше получаем данные из конфига (которых нет) и заполняем:
Код:
config.set("key1", "value1");
config.set("key2", "value2");
config.set("key3", true);
Но в больших плагинах данных много, а ещё надо делать комментарии! Согласитесь, это не удобно!
Поэтому я предлагаю другой способ:
Код:
        if (!file.exists()) {
            InputStream is = Main.class.getResourceAsStream("/main/java/resources/config.yml");
            InputStreamReader reader = new InputStreamReader(is);
            try {
                FileWriter writer = new FileWriter(file);
                writer.flush();
                file.createNewFile();
                int i = reader.read();
                while (i != -1) {
                    writer.write(i);
                    i = reader.read();
                }
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
Сложно? Давайте всё разберём по шагам:
По примеру выше я думаю, вы поняли, что file.exists() проверяет существует ли файл
InputStream получает файл из папки проекта (в нашем случае в /src/main/java/resources), где мы его можем создать, как обычный yaml и заполнить. Это удобнее!
InputStreamReader - читает этот файл, чтобы в будущем перенести его наружу в папку plugins/плагин
FileWriter - это класс джавы, который позволяет записывать данные в файл.
writer.flush() - необязателен, очищает файл (может пригодиться в будущем)
file.createNewFile() - думаю понятно (создает новый пустой файл)
reader.read() - читает символ из файла (возвращает число!)
writer.write() - записывает символ в файл
Получается данный цикл читает данные из файла в корневой папки по одному символу и записывает
эти данные в файл в папке /plugins/ВашПлагин, а именно в config.yml.
writer.close() - закрывает файл после записи (обязательно)!
e.printStackTrace() - печатает данные об ошибке
IOException - ошибка, которая может возникнуть при работе с файлами и сайтами.
Теперь думаю всё понятно! Но если вам нужно обрабатывать несколько файлов, лучше создать отдельный класс!




@imDaniX предложил более современный способ: plugin.saveResourcee(args);
 
Последнее редактирование:
Ты из нулевых что ли вылез? Сколько же костылей, все это делается на ведроапи в 2 строки.
 
https://jd.papermc.io/paper/1.20.6/org/bukkit/plugin/Plugin.html
Plugin#saveDefaultConfig - сохранит config.yml из джарника плагина в его папку.
Plugin#saveResource - сохранит любой файл из джарника плагина в его папку; replace стоит указать false, чтоб существующие файлы не удалялись.
Plugin#reloadConfig - перезагрузит config.yml с диска.
Plugin#getConfig - вернёт config.yml.
Plugin plugin = Bukkit.getPluginManager().getPlugin(getName()); //Получаем наш плагин
У тебя плагин это уже this - тебе не нужно его повторно получать.
 
У тебя плагин это уже this - тебе не нужно его повторно получать.
Это полезно, если мы будем работать не из класса Main

Plugin#saveDefaultConfig - сохранит config.yml из джарника плагина в его папку.
Plugin#saveResource - сохранит любой файл из джарника плагина в его папку; replace стоит указать false, чтоб существующие файлы не удалялись.
Plugin#reloadConfig - перезагрузит config.yml с диска.
Plugin#getConfig - вернёт config.yml.
Спасибо за информацию, но кроме saveResource(), работают с единичным файлом, а мой способ позволяет работать с любым количеством

Ты из нулевых что ли вылез? Сколько же костылей, все это делается на ведроапи в 2 строки.
В каком смысле из нулевых?
 
А зачем так усложнять создание конфига, если достаточно будет в методе onEnable() прописать saveDefaultConfig(); ?

А если нужно будет обратиться к конфигу из другого класса, то получим экземпляр главного класса:

Код:
package ru.derwold.joineffects;

import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

public final class test extends JavaPlugin {

    private static test plugin;
    public static test getInstance() {
        return plugin;
    }

    @Override
    public void onEnable() {
        plugin = this;
        saveDefaultConfig();
    }
}
 
Последнее редактирование:
Потому что, зачастую тебе нужно создать не только config.yml
 
Это полезно, если мы будем работать не из класса Main
Для этого существует практика dependency injection.
Спасибо за информацию, но кроме saveResource(), работают с единичным файлом, а мой способ позволяет работать с любым количеством
Потому что, зачастую тебе нужно создать не только config.yml
Мой способ более универсальный
Для остального, собственно, методы из YamlConfiguration, которые у тебя показаны - но это уже самые базовые вещи работы с кастомными конфигами. Ну, и код вытаскивания файлов из конфига непонятно зачем нужен, ибо существует saveResource().

По поводу комментариев в конфиге не актуально, к слову - уже есть setComments и setInlineComments.
 
Тогда уже проще обратиться к типичному синглтону, если работаешь в рамках одного плагина (но не надо)
Я лишь говорю, что это возможно - упоминаний ничего из сказанного мной в туториале нет.
 
Тогда мой пост бесполезен, т. к. подобные уже были
 

Поделиться этой страницей

Назад
Верх