
- •Лабораторная работа № 3 Обработка файлов
- •Введение
- •Класс InputStream
- •Класс OutputStream
- •Файловый ввод/вывод
- •Буферизованные потоки
- •Класс File
- •Класс RandomAccessFile
- •Пример подсчета количества определенного слова в файле
- •Пример объекта "Книга" с методами чтения и записи в файл
- •Работа с конфигурационными файлами
- •Пример класса preloader для загрузки конфигурационного файла
- •Контрольные вопросы
- •Задание
- •Приложение 1. Работа с датой и временем в Java
- •Приложение 2. Класс StreamTokenizer
Работа с конфигурационными файлами
В Java можно использовать как распространенный формат конфигурационного файла ini (*.ini), так и собственный формат файла свойств properties (*.properties).
Конфигурационные файлы это текстовые файлы, содержащие пары: ключ=значение
Для пояснения содержимого конфигурацонных файлов используются комментарии. Для файлов *.ini кооментарии предваряются символами # или ;, а для файлов *.properties - # или !.
Ini-файлы конфигурации располагают несколько большим количеством возможностей, например, делением на секции (см. https://ru.wikipedia.org/wiki/.ini), нежели *.properties (см. https://ru.wikipedia.org/wiki/.properties ) однако в Java по умолчанию не предусмотрена обработка этих дополнительных возможностей.
Для работы с конфигурационными файлами обоих типов в Java можно использовать класс java.util.Properties, метод load которого загружает пары ключ=значение из конфигурационного файла в ассоциативный массив. При этом и ключи и значения являются строками. Для работы с ключами и значениями как с другими типами данных требуется ипсользовать операции приведения типов, например:
APP_INT_VALUE = Integer.valueOf(props.getProperty("APP_INT_VALUE", "1"));
Посокльку конфигурационный файл должен читаться в начале запуска программы, а при запуске программы из исполняемого jar путь к конфигурационному файлу может быть иным, нежели на компьютере разработчика, то для этого случая применяют закгрузку конфигурационного файла как потокового ресурса класса - class.getResourceAsStream(FileName). В этом случае конфигурационный файл ищется в том-же пакете, что и класс.
Пример класса preloader для загрузки конфигурационного файла
package auto;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
*
* @author Андрей
*/
public class Preloader {
public Preloader(String FileName, Properties props) throws IOException, Exception {
getConfigFile(FileName, props);
Preloader.class.getResource("config.ini");
}
private static void getConfigFile(String FileName, Properties props) throws FileNotFoundException, IOException, Exception {
InputStream fs;
try {
File f = new File(FileName);
//System.out.println(f.canRead()+" "+f.canWrite()+" "+f.getAbsolutePath());
if(f.exists()) {
fs = new FileInputStream(f);
} else {
fs = Preloader.class.getResourceAsStream(FileName);
}
props.load(fs);
System.out.println("Конфигурация загружена");
fs.close();
} catch (FileNotFoundException e) {
System.err.println("Конфигурационный файл не найден. Ошибка - "+e.getMessage());
} catch (IOException e) {
System.err.println("Конфигурационный файл не читается. Ошибка - "+e.getMessage());
} catch (Exception e) {
throw new Exception("Ошибка загрузки конфигурационного файла. Ошибка - "+e.getMessage());
}
}
}
Использование класса Preloader в основной программе
package auto;
import controller.Main;
import java.util.Properties;
import java.util.Scanner;
import model.Body;
import model.doors.Dictionaries;
import view.Menu;
/**
*
* @author Андрей
*/
public class Common {
public static Body model;
public static Main controller;
public static Menu view;
public static Properties prop;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
/*
0. Загружаем данные конфигурации
1. Инициализируем модель
2. Инициируем представление
3. Инициализируем контроллер и передаем туда модель и представление
4. Запускаем бесконечный цикл в котором просматриваем результат меню на выход
*/
try {
prop = new Properties();
//Нужно не забыть сделать ресурсом, чтобы запускался из jar
//Preloader PRL = new Preloader("src/auto/config.ini", prop);
Preloader PRL = new Preloader("config.ini", prop);
model = new Body();
view = new Menu();
controller = new Main(model, view, prop);
boolean run = true;
while(run) {
run = controller.swichMenu();
}
} catch (Exception e) {
System.err.println("Ошибка - "+e.getMessage());
}
}
}