2015-06-14 2 views
0

Я работаю над плагином, который требует значительного количества хранимых данных. У меня он хранится в пользовательском файле конфигурации, который я нашел в Интернете, который работает в основном так же, как и по умолчанию.Должны ли объекты Ямлконфигурации закрываться?

Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как фактически закрыть файл, или мне даже нужно, поскольку я мало знаю о конфигурациях yaml. Код для шаблона, который я использовал ниже.

Мне также интересно узнать, как я должен хранить большие объемы данных в будущем.

public class CustomConfig { 
    //store name of file to load/edit 
    private final String fileName; 
    //store plugin, to get file directory 
    private final JavaPlugin plugin; 

    //store actual hard disk file location 
    private File configFile; 
    //store ram file copy location 
    private FileConfiguration fileConfiguration; 


    //constructor taking a plugin and filename 
    public CustomConfig(JavaPlugin plugin, String fileName) { 
     //ensure plugin exists to get folder path 
     if (plugin == null) 
      throw new IllegalArgumentException("plugin cannot be null"); 
     //set this classes plugin variable to the one passed to this method 
     this.plugin = plugin; 
     //get name of file to load/edit 
     this.fileName = fileName; 
     //get directory/folder of file to load/edit 
     File dataFolder = plugin.getDataFolder(); 
     if (dataFolder == null) 
      throw new IllegalStateException(); 
     //load config file from hard disk 

     this.configFile = new File(plugin.getDataFolder(), fileName); 

     reloadConfig(); 
    } 

    public void reloadConfig() { 
     //load memory file from the hard copy 
     fileConfiguration = YamlConfiguration.loadConfiguration(configFile); 

     // Look for defaults in the jar 
     File configFile = new File(plugin.getDataFolder(), fileName); 
     if (configFile != null) { 
      YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(configFile); 
      fileConfiguration.setDefaults(defConfig); 
     } 
    } 

    public FileConfiguration getConfig() { 
     if (fileConfiguration == null) { 
      this.reloadConfig(); 
     } 
     return fileConfiguration; 
    } 

    public void saveConfig() { 
     if (fileConfiguration == null || configFile == null) { 
      return; 
     } else { 
      try { 
       getConfig().save(configFile); 
      } catch (IOException ex) { 
       plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex); 
      } 
     } 
    } 

    public void saveDefaultConfig() { 
     if (!configFile.exists()) {    
      this.plugin.saveResource(fileName, false); 
     } 
    } 
} 
+1

Не могли бы вы быть более конкретными в отношении той части кода, с которой вам хотелось бы помочь? Хотя я чувствую, что некоторые из этого кода могут быть сокращены, я не вижу очевидных ошибок, и у вас нет метода, который записывает в файл. Я считаю, что единственное, что вам нужно сделать после редактирования файла YAML, это сохранить его, не требуя закрытия. Для больших объемов данных вы можете искать базы данных (SQLite, MySQL и т. Д.) –

+0

Я полагаю, что это все, что мне нужно было знать, я никогда не использовал yaml и был смущен отсутствием возможности закрыть его. Автоматически ли он удаляется из бара после его сохранения? – donsavage

+2

Если вам нужно хранить много данных, вы должны изучить [MySQL] (https://www.mysql.com/) – Jojodmo

ответ

0

Вам не нужно закрывать конфигурацию. Это не BufferedWriter. Конфигурация хранит все данные в памяти до тех пор, пока сервер не выключится. Это означает, что если вы измените что-то в конфигурации за время, когда ваш плагин включен, вам нужно будет использовать ваш метод reloadConfig(). Единственное, что вам нужно сделать после использования метода FileConfiguration#set(String, Object), - использовать FileConfiguration#saveConfig(), чтобы сообщить Bukkit о текущем состоянии вашей конфигурации и скопировать его в ваш файл конфигурации.

+0

Он не использует конфигурацию по умолчанию. –

+0

Не имеет значения, использует ли он конфигурацию по умолчанию или собственную конфигурацию. Единственная разница между его реализацией и конфигурацией API Bukkit заключается в том, что один из них был создан им. – ColonelHedgehog

0

Не обязательно закрывать YamlConfiguration объектов.

Хотя конфигурация по умолчанию (JavaPlugin.getConfig()) привязана к жизненному циклу плагина, пользовательские из них расположены, когда любой другой объект Java, т. Е. Когда сборщик мусора определяет, что в коде больше нет ссылок, указывающих на них.

Смежные вопросы