Как реализовать чтение команд из файла?

Рейтинг: 2Ответов: 1Опубликовано: 17.03.2023

Пишу консольное приложение для работы с коллекцией, для управления коллекцией реализуются команды, которые вводятся с консоли:

  • 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, так как она вызывает свои строки-приглашения, нужно как-то реализовать рекурсию, но как?

Ответы

▲ 0Принят

С использованием рекурсии получилось вот так:

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 отрабатывает правильно, в том числе учитывая рекурсивный вызов.