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

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

Korvinius

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

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

Реализация c HashSet:
Java:
        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:
Java:
    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();
        }        
    }
 
Последнее редактирование:
Вы уверены что хорошая идея делать это перед тем как загружать инфу из файла?
Или я чего-то не понял..
Убрал это, проверил, результат не изменился :(
мне кажется, что "сбой" происходит именно на этапе считывания информации из файла, потому, как если есть в переменной какие либо данные, они в файл сохраняются, а если данных нет, то сохраняется пустой файл, не зависимо от того было в нем что то до этого или не было. Понять бы почему они не считываются...
 
мне кажется, что "сбой" происходит именно на этапе считывания информации из файла, потому, как если есть в переменной какие либо данные, они в файл сохраняются, а если данных нет, то сохраняется пустой файл, не зависимо от того было в нем что то до этого или не было. Понять бы почему они не считываются...

Удаляется тут:
Код:
        File f = new File (getDataFolder()+File.separator+"notmult.yml");
        if (f.exists()) f.delete();

А вообще не совсем понятно чего Вы хотите добиться. Вообще всё дело в том, что Вы пишите одно, читаете - другое, а стремитесь к чему-то третьему ;)

Если notmult - это List<String> то при считывании в него записываете только ключи. Т.е. судя по всему после считывания в нём находится только один элемент "notmult":
Код:
                for (String key : cfg.getConfigurationSection("notmult").getKeys(false)) {
                    notmult.add(key);
                }
Как я понимаю, Вы хотите конфигурационный файл вида:
Код:
notmult:
     player1
     player2
     player3
     player4

Но тут у Вас путаница. Вы при чтении из файла перебираете только ключи. Но одному ключу может соответствовать только одно значение.

Поэтому когда Вы пишите в конфигурацию:
Код:
        for (int i = 0; i < notmult.size(); i++){
            nick = notmult.get(i);
            cfg.set("notmult", nick);
        }

то получаете в результате что-то вроде:
Код:
notmult: player4
Причем, player1 ... player3 друг друга по очереди перезаписали.

Мне кажется Вам нужно использовать List<String> и для чтения данных — cfg.getStringList("notmult");
В этом случае формат хранения будет такой:
Код:
notmult:
    - player1
    - player2
    - player3
    - player4
 
Мне кажется Вам нужно использовать List<String> и для чтения данных — cfg.getStringList("notmult");
В этом случае формат хранения будет такой:
Код:
notmult:
    - player1
    - player2
    - player3
    - player4
Спасибо большое, это именно то, что мне нужно.
Чтобы не плодить новых тем, продолжу эту, допустим есть примерно такой конфиг:
YAML:
...
...
ps:                                                                                                                                                                                           
  check: true                                                                                                                                                                                 
  group: true                                                                                                                                                                                 
  login: true                                                                                                                                                                                 
  keyplayer:
- key1: value1 
- key2: value2
- key3: value3
- key4: value4
как правильно организовать чтение данных keyX: valueX в HashMap и запись их обратно? Или может можно организовать это как то по другому?

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

Как организовать это в отдельном файле:
YAML:
key1: value1
key2: value2
key3: value3
key4: value4
я знаю, но это не имеет смысла, так как данных будет не много и дополнительный файл просто лишний.
http://wiki.bukkit.org/Configuration_API_Reference#HashMaps

Или так
Java:
ConfigurationSection section = Config.getConfigurationSection("path.to.map");
for (String key : section.getKeys) {
HashMap.put(key, section.get(key));
}
 
Спасибо, пойду экспериментировать)
Все отлично получилось, спасибо вам за помощь!
 
Зачем делать цикл, когда можно получить мапу методом getValues.
Мне, например, так удобней. Ведь ты же не будешь постоянно грузить из конфига, а только в начале или при релоаде конфига.
 
Вот так сделал:
Java:
public Map<String, Object> ps = new HashMap<String, Object>();
ps = this.getConfig().getConfigurationSection("ps.playerps").getValues(false)
и работает
 
Снова здравствуйте, есть примерно такой файл конфигурации:
Код:
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
***********
И есть объект содержащий элементы:
String1: text
String2: text
String3: text
MapString:
Код примерно такой:
Java:
            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 = //как то нужно считать из конфига,
                    //******это и есть суть вопроса...******

                    //**
                    //ну и здесь дальше передаются все эти данные в объект,
                    //с этим вопросов нет
                    //**
                }
            }
В общем, подскажите как это сделать правильно :)
 
Последнее редактирование:
Java:
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));
        }
 

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

Назад
Верх