С чего начать: Работа с файлами конфигурации

fromgate

Administrator

Работа с файлами конфигурации

Мы продолжаем работать с проектом FirstPlugin, который был создан в предыдущем уроке.

Файл конфигурации плагина - это главный способ хранения настроек или рабочей информации.
Базовым файлом настроек, является файл config.yml, который находится в директории плагина. Для работы с этим файлом не нужно обращаться к нему по имени, станадртные методы (getConfig(), saveConfig(), reloadConfig()) уже есть в классе плагина (точнее в PluginBase, наследником от которого, является любой плагин).

Для создания такого файла часто используется заранее подготовленный шаблон, в котором коммантариями поясняется что делает тот или иной параметр настроек.
Для примера не нужно далеко ходить - файл nukkit.yml, хранящий настройки сервера, как раз и есть такой заранее подготовленный файл.

1. Cоздаем шаблон файла конфигурации

config01.png

Называем его, соответственно config.yml

config02.png

И набираем содержимое файла

YAML:
# Пример файла конфигурации
#
# параметр: hello-message - содержит сообщение, которое будет выводиться
#						   при старте сервера
#
hello-message: Сообщение из файла конфигурации прочитано!
config03.png

Шаблон файла подготовлен. При компиляции он будет добавлен в jar-файл плагина.
Теперь нужно чтобы плагин при первом старте плагина сохранял этот файл.

2. Создаем метод сохраняющий файл конфигурации в директории плагина

Создаем в классе плагина метод initConfig():

Java:
	public void initConfig(){
		this.getDataFolder().mkdirs();
		this.saveResource("config.yml");
	}
Здесь происходит:
1. Создание директории плагина (если её еще не существует). Метод плагина getDataFolder() всегда возвращает объект File указывающий на директорию плагина.
2. Сохраняется файл config.yml из jar-файла. Сохранение произойдёт, только если в директории плагина не существует файла с таким же именем.

Вызывать этот метод будем из метода onEnable() — метода который всегда выполняется при старте плагина.

После этого можно подумать о чтении настроек из файла.


3. Создаем метод, считывающий значение параметров из config.yml

Я предпочитаю создавать переменную, считывать в неё значение из конфига и потом работаь с этой переменной.

Поэтому в классе плагина опишем переменную helloMessage:
Code:
String helloMessage;
И создадим ещё один метод, для чтения настроек из файла:
Java:
	public void loadCfg(){
		this.reloadConfig();
		this.helloMessage = this.getConfig().getString("hello-message","Сообщение по умолчанию");
	}
Вызов этого метода, добавим после вызова метода initConfig() в onEnable().

Ну а в строке, котороая выводила сообщение "My first plugin enabled" мы организуем вывод значения переменной helloMessage.

В итоге метод onEnable примет такой вид:
Java:
	@Override
	public void onEnable(){
		this.initConfig();
		this.loadCfg();
		this.getLogger().info(TextFormat.RED+this.helloMessage);
	}
Ну а весь плагин будет таким:
getString.png

4. Компилируем и смотрим на результат

Жмём Ctrl+F9, запускаем сервер и...

config05.png

Как видите, сообщение было успешно прочитано из файла.
Если Вы проверите директорию plugins на сервере, то увидите, что там была создана директория FirstPlugin, а в ней появился файл config.yml.
 
Last edited:

BlackJIeB

Developer
Тут не сказано про его генерацию) Если кратко, то:


Code:
	public void createData(String username) {
		String name = username.toLowerCase().trim();
		if(!(checkUsername(name))) {
			Config config = new Config(
					new File(this.getDataFolder() + "/players/", name + ".yml"),
					Config.YAML,
					//Default values (not necessary)
					new LinkedHashMap<String, Object>() {
						{
							put("group", "user");
						}
					});
				config.save();
		}
	}
 

BlackJIeB

Developer
Также прилагаю функцию "checkUsername", которая определяет, есть ли файл в нужной директории:

Code:
	public boolean checkUsername(String username) {
		String name = username.toLowerCase().trim();
		return new File(this.getDataFolder() + "/players/" + name + ".yml").isFile();
	}
 

fromgate

Administrator
Тут не сказано про его генерацию) Если кратко, то:


Code:
	public void createData(String username) {
		String name = username.toLowerCase().trim();
		if(!(checkUsername(name))) {
			Config config = new Config(
					new File(this.getDataFolder() + "/players/", name + ".yml"),
					Config.YAML,
					//Default values (not necessary)
					new LinkedHashMap<String, Object>() {
						{
							put("group", "user");
						}
					});
				config.save();
		}
	}

Ну да, но это уже другая задача ;)
Здесь речь идёт о стандартном конфиге, макет которого сохранён в виде ресурса. Для большинства плагинов этого достаточно.

Кстати, пример, который Вы привели требует чтобы файл уже существовал.
Это такая особенность, которую я бы отнёс скорее к багам, nukkit'а. В общем всегда когда обращаетесь к фалу (будь то через getConfig() или непосредственно к определенному файлу), то нужно обязательно проверять существует ли файл. И если его нет, то создавать хотя бы пустой файл.

В моем примере, это делается через сохранение ресурсного файла - отдельной проверки не требуется.
 

PhantomasGamer

Пользователь
у меня в консоли выдает ошибку(
код идентичный вашему
 
Top