Как реализовать чтение команд из файла?
Пишу консольное приложение для работы с коллекцией, для управления коллекцией реализуются команды, которые вводятся с консоли:
add_element- добавляет элемент к в коллекциюclear_collection- очищает коллекциюsave_collection 'file_name'- сохранение коллекции в указанный файлscript 'file_name'- считывает команды с указанного файла и выполняет их.
Коллекция ArrayList содержит элементы класса:
public class Worker {
String name;
String surName;
int age;
String jobTitle;
int experience;
}
Команда add_element выполняется так: при вызове этой команды происходит печать строки "Введите имя :" и соответственно пользователь должен ввести имя, далее аналогично еще 4 строки-приглашения для ввода остальных 4 параметров коллекции.
Вопрос: как реализовать команду script 'file_name'? То есть, как реализовать чтение команд из файла? В файле, например, содержатся строки (каждая с новой строки) - команда add_element и 5 параметров:
add
name
surName
25
ml
3
Понятно, что просто построчное чтение не подойдет, из-за команды add, так как она вызывает свои строки-приглашения, нужно как-то реализовать рекурсию, но как?
Ответы (1 шт):
С использованием рекурсии получилось вот так:
class Task {
private final List<Worker> workers = new ArrayList<>();
public void add_element(List<String> lines, int pos) {
workers.add(new Worker(
lines.get(++pos), lines.get(++pos), Integer.parseInt(lines.get(++pos)),
lines.get(++pos), Integer.parseInt(lines.get(++pos))
));
}
public void clear_collection() {
workers.clear();
}
public void save_collection(String fileName) throws IOException {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
for (Worker worker : workers) {
writer.write(worker + "\n");
}
}
}
public void script(String fileName) throws IOException {
int pos = 0;
List<String> lines = Files.readAllLines(Paths.get(fileName));
while (pos < lines.size()) {
if (lines.get(pos).equals("add_element")) {
add_element(lines, pos);
pos += 5;
} else if (lines.get(pos).equals("clear_collection")) {
clear_collection();
pos++;
} else if (lines.get(pos).contains("save_collection")) {
String line = lines.get(pos);
save_collection(line.substring(line.indexOf("'") + 1, line.lastIndexOf("'")));
pos++;
} else if (lines.get(pos).contains("script")) {
String line = lines.get(pos);
script(line.substring(line.indexOf("'") + 1, line.lastIndexOf("'")));
pos++;
} else {
pos++;
}
}
}
public List<Worker> getWorkers() {
return workers;
}
}
Все 4 команды разбиты по методам. Метод add_element() добавляет в список очередного Worker-а, метод clear_collection() просто очищает список, метод save_collection() сохраняет список в указанный файл, занося туда построчно элементы списка.
Метод script() считывает передаваемый в него файл в список строк, которым дальше и оперирует. Переменная pos означает текущую позицию для взятия из списка очередной строки. После выполнения сохранения, очистки списка и команды script она наращивается на единицу, а после выполнения команды add_element - на пять.
Конечно, чтобы программа работала, должны соблюдаться следующие ограничения:
- "скриптовый" файл не содержит лишних символов
- после команды
add_elementобязательно идёт 5 строк, означающих параметры - после команд
scriptиclear_collectionимя желаемого файла заключается в одинарные кавычки'.
Если эти условия соблюдаются, то команда script отрабатывает правильно, в том числе учитывая рекурсивный вызов.