Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите YamlConfiguration, чтение и запись данных

Тема в разделе "Разработка плагинов для новичков", создана пользователем Korvinius, 2 янв 2015.

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

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

    Баллы:
    88
    Здравствуйте,
    Опять прошу совета, не буду расписывать всех условий, но при заходе игрока подпадающего под эти условия, его ник передается в переменную. При выключении сервера, данные с этой переменной записываются в файл *.yml, это в принципе работает, файл создается, данные записываются, а при включении сервера, эти данные из файла должны считываться обратно в переменную.

    Но проблема заключается в том, что даже после обычной перезагрузки сервера, этот файл полностью очищается, я пока своим не опытным взглядом не вижу где ошибка, посмотрите, может вы подскажете?

    Реализация c HashSet:
    Код:
            public void loadNotMult(){
                YamlConfiguration cfg = new YamlConfiguration();
                File f = new File (getDataFolder()+File.separator+"notmult.yml");
                notmult.clear();
                if (f.exists()) {
                    try {
                        cfg.load(f);
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                    if (cfg.getConfigurationSection("notmult") != null) {
                        for (String key : cfg.getConfigurationSection("notmult").getKeys(false)) {
                            notmult.add(key);
                        }
                        if (NoMult.instance.debug) {                    
                        }
                    }
                }
            }
    
            public  void saveNotMult(){
                try {
                    YamlConfiguration cfg = new YamlConfiguration();
                    for (String key : notmult){
                        cfg.set("notmult", key);
                    }
                    File f = new File (getDataFolder()+File.separator+"notmult.yml");
                    if (f.exists()) f.delete();
                    cfg.save(f);            
                } catch (Exception e){
                    e.printStackTrace();
                }
            }
    Реализация с ArrayList:
    Код:
        public void loadNotMult(){
            YamlConfiguration cfg = new YamlConfiguration();
            File f = new File (getDataFolder()+File.separator+"notmult.yml");
            notmult.clear();
            if (f.exists()) {
                try {
                    cfg.load(f);
                } catch (Exception e){
                    e.printStackTrace();
                }
                if (cfg.getConfigurationSection("notmult") != null) {
                    for (String key : cfg.getConfigurationSection("notmult").getKeys(false)) {
                        notmult.add(key);
                    }
                    if (NoMult.instance.debug) {                    
                    }
                }
            }
        }
    
        public  void saveNotMult(){
            String nick = null;
            YamlConfiguration cfg = new YamlConfiguration();
            for (int i = 0; i < notmult.size(); i++){
                nick = notmult.get(i);
                cfg.set("notmult", nick);
            }
            File f = new File (getDataFolder()+File.separator+"notmult.yml");
            if (f.exists()) f.delete();
            try {
                cfg.save(f);            
            } catch (Exception e){
                e.printStackTrace();
            }        
        }
     
    Последнее редактирование: 2 янв 2015
  2. Хостинг MineCraft
    <
  3. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Вы уверены что хорошая идея делать это перед тем как загружать инфу из файла?
    Или я чего-то не понял..
     
  4. Автор темы
    Korvinius

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

    Баллы:
    88
    Убрал это, проверил, результат не изменился :([DOUBLEPOST=1420153638,1420152275][/DOUBLEPOST]мне кажется, что "сбой" происходит именно на этапе считывания информации из файла, потому, как если есть в переменной какие либо данные, они в файл сохраняются, а если данных нет, то сохраняется пустой файл, не зависимо от того было в нем что то до этого или не было. Понять бы почему они не считываются...
     
  5. Автор темы
    Korvinius

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

    Баллы:
    88
    Спасибо большое, это именно то, что мне нужно.[DOUBLEPOST=1422876378,1420224175][/DOUBLEPOST]Чтобы не плодить новых тем, продолжу эту, допустим есть примерно такой конфиг:
    Код:
    ...
    ...
    ps:                                                                                                                                                                                           
      check: true                                                                                                                                                                                 
      group: true                                                                                                                                                                                 
      login: true                                                                                                                                                                                 
      keyplayer:
    - key1: value1 
    - key2: value2
    - key3: value3
    - key4: value4
    
    как правильно организовать чтение данных keyX: valueX в HashMap и запись их обратно? Или может можно организовать это как то по другому?

    Как организовать это в отдельном файле:
    Код:
    key1: value1 
    key2: value2
    key3: value3
    key4: value4
    я знаю, но это не имеет смысла, так как данных будет не много и дополнительный файл просто лишний.
     
  6. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Была ж с неделю назад похожая с вопросом про конфиг и хешмэп, с телефона лень искать, там вроде было разобрано.
     
  7. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    http://wiki.bukkit.org/Configuration_API_Reference#HashMaps

    Или так
    Код:
    ConfigurationSection section = Config.getConfigurationSection("path.to.map");
    for (String key : section.getKeys) {
    HashMap.put(key, section.get(key));
    }
    
     
  8. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Зачем делать цикл, когда можно получить мапу методом getValues.
     
  9. Автор темы
    Korvinius

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

    Баллы:
    88
    Спасибо, пойду экспериментировать)[DOUBLEPOST=1422920037,1422903016][/DOUBLEPOST]Все отлично получилось, спасибо вам за помощь!
     
  10. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Мне, например, так удобней. Ведь ты же не будешь постоянно грузить из конфига, а только в начале или при релоаде конфига.
     
  11. Автор темы
    Korvinius

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

    Баллы:
    88
    Вот так сделал:
    Код:
    public Map<String, Object> ps = new HashMap<String, Object>();
    ps = this.getConfig().getConfigurationSection("ps.playerps").getValues(false)
    и работает
     
  12. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Ну ок, оно и должно работать.
     
  13. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Объявить переменную не запрещается.
     
  14. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Проехали, ничего не понял, что ты от меня хочешь...
     
  15. Автор темы
    Korvinius

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

    Баллы:
    88
    Снова здравствуйте, есть примерно такой файл конфигурации:
    Код:
    sector1:                                                                                                                                                                                
      String1: text                                                                                                                                                                       
      String2: text                                                                                                                                                                      
      String3: text                                                                                                                                                                
      MapString:                                                                                                                                                                         
        key1: text1
        key2: text2
        key3: text3
        key4: text4
    sector2:                                                                                                                                                                                
      String1: text                                                                                                                                                                       
      String2: text                                                                                                                                                                      
      String3: text                                                                                                                                                                
      MapString:                                                                                                                                                                          
        key1: text1
        key2: text2
        key3: text3
        key4: text4
    sector3:                                                                                                                                                                                
      String1: text                                                                                                                                                                       
      String2: text                                                                                                                                                                      
      String3: text                                                                                                                                                                
      MapString:                                                                                                                                                                          
        key1: text1
        key2: text2
        key3: text3
        key4: text4
    ***********    
    И есть объект содержащий элементы:
    Код примерно такой:
    Код:
                if (cfg != null) {
                    for (String key : cfg.getKeys(false)) {
                        String String1 = cfg.getString(key + "." + "String1");
                        String String2 = cfg.getString(key + "." + "String2");
                        String String3 = cfg.getString(key + "." + "String3");
    
                        HashMap MapString = //как то нужно считать из конфига,
                        //******это и есть суть вопроса...******
    
                        //**
                        //ну и здесь дальше передаются все эти данные в объект,
                        //с этим вопросов нет
                        //**
                    }
                }
    В общем, подскажите как это сделать правильно :)
     
    Последнее редактирование: 5 июл 2015
  16. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Код:
    HashMap<String, String> map = new HashMap<String, String>();
            ConfigurationSection section = config.getConfigurationSection("path");
            for (String key : section.getKeys(false)){
                map.put(key, section.getString(key));
            }
    
     
  17. Автор темы
    Korvinius

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

    Баллы:
    88
    Я пробовал такое, но вот на эту строку:
    получается:
    и данные не считываются :(
     
  18. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Путь до секции точно правильный?
     
  19. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Тебе просто нужно двойную форку чтоб разом все вывести. Получить главные ключи, потом внутренние.
     
  20. Автор темы
    Korvinius

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

    Баллы:
    88
    да, действительно, спасибо большое, не досмотрел, ошибка была в разнице между "С" и "с".
     

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