1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем koten0k, 27 май 2024.

  1. Автор темы
    koten0k

    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);
     
    Последнее редактирование: 29 май 2024
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ты из нулевых что ли вылез? Сколько же костылей, все это делается на ведроапи в 2 строки.
     
  3. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    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.
    У тебя плагин это уже this - тебе не нужно его повторно получать.
     
  4. Автор темы
    koten0k

    koten0k Активный участник Пользователь

    Баллы:
    46
    Это полезно, если мы будем работать не из класса Main

    Спасибо за информацию, но кроме saveResource(), работают с единичным файлом, а мой способ позволяет работать с любым количеством

    В каком смысле из нулевых?
     
  5. BetterLex

    BetterLex Активный участник Пользователь

    Баллы:
    76
    А зачем так усложнять создание конфига, если достаточно будет в методе 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();
        }
    }
     
    Последнее редактирование: 28 май 2024
  6. Автор темы
    koten0k

    koten0k Активный участник Пользователь

    Баллы:
    46
    Потому что, зачастую тебе нужно создать не только config.yml
     
  7. Автор темы
    koten0k

    koten0k Активный участник Пользователь

    Баллы:
    46
    Мой способ более универсальный
     
  8. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Для этого существует практика dependency injection.
    Для остального, собственно, методы из YamlConfiguration, которые у тебя показаны - но это уже самые базовые вещи работы с кастомными конфигами. Ну, и код вытаскивания файлов из конфига непонятно зачем нужен, ибо существует saveResource().

    По поводу комментариев в конфиге не актуально, к слову - уже есть setComments и setInlineComments.
     
  9. Автор темы
    koten0k

    koten0k Активный участник Пользователь

    Баллы:
    46
    Более сложно
    Менее удобно
     
  10. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    В смысле сложно если это база? Если уже начал учить людей, то учи либо нормально либо никак.
     
  11. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Тогда уже проще обратиться к типичному синглтону, если работаешь в рамках одного плагина (но не надо)
    Я лишь говорю, что это возможно - упоминаний ничего из сказанного мной в туториале нет.
     
  12. Автор темы
    koten0k

    koten0k Активный участник Пользователь

    Баллы:
    46
    Тогда мой пост бесполезен, т. к. подобные уже были
     

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