- Парсинг аргументов командной строки в Java
- Стандартный подход
- Использование библиотек для парсинга аргументов
- Apache Commons CLI
- JCommander
- Вывод
- Разбор параметров командной строки
- Интерфейсы командной строки Java (часть 2): args4j
- args4j Определение аргументов командной строки через аннотации @Option
- Разбор аргументов командной строки в args4j
Парсинг аргументов командной строки в Java
При работе с командной строкой, часто сталкиваются с ситуацией, когда необходимо обработать аргументы командной строки. Возьмем, к примеру, консольное приложение, которое принимает на входе имя файла и опцию для обработки этого файла. Имя файла и опцию мы передаем в программу как аргументы командной строки.
Стандартный подход
В Java аргументы командной строки передаются в метод main() в виде массива строк (String[] args). Этот массив содержит значения, переданные программе при запуске. Рассмотрим пример:
В этом примере, все аргументы, переданные программе, будут выведены на экран. Однако, этот подход не всегда удобен, особенно когда количество и порядок аргументов может меняться.
Использование библиотек для парсинга аргументов
Для более удобного и гибкого парсинга аргументов командной строки можно использовать специализированные библиотеки, такие как Apache Commons CLI, JCommander и др.
Apache Commons CLI
Apache Commons CLI предоставляет набор классов для парсинга аргументов командной строки. Он поддерживает простые однобуквенные опции, длинные опции, сбор аргументов и автоматическое создание сообщений с использованием.
import org.apache.commons.cli.*; public class Main < public static void main(String[] args) < Options options = new Options(); options.addOption("f", "file", true, "имя файла"); options.addOption("o", "option", true, "опция обработки"); CommandLineParser parser = new DefaultParser(); try < CommandLine cmd = parser.parse(options, args); if (cmd.hasOption("f")) < System.out.println(cmd.getOptionValue("f")); >if (cmd.hasOption("o")) < System.out.println(cmd.getOptionValue("o")); >> catch (ParseException e) < e.printStackTrace(); >> >
В примере выше, приложение ожидает два аргумента: -f (или —file ) с именем файла и -o (или —option ) с опцией обработки.
JCommander
JCommander — это другая мощная библиотека для парсинга аргументов командной строки в Java. Она позволяет использовать аннотации для указания ожидаемых аргументов.
import com.beust.jcommander.*; public class Main < @Parameter(names = , description = "Имя файла") private String file; @Parameter(names = , description = "Опция обработки") private String option; public static void main(String[] args) < Main main = new Main(); JCommander.newBuilder().addObject(main).build().parse(args); System.out.println(main.file); System.out.println(main.option); >>
В этом примере, JCommander использует аннотации для связывания аргументов командной строки с полями класса.
Вывод
Есть различные способы парсинга аргументов командной строки в Java. Можно использовать стандартный подход и работать с массивом строк, переданным в метод main() , или использовать библиотеки для более удобного и гибкого парсинга аргументов. Выбор подхода зависит от конкретной задачи и личных предпочтений.
Разбор параметров командной строки
Написать класс, который разбирает командную строку, переданную на вход программе. При создании объекта этого
класса, он получает набор разделителей и набор самих ключей, который допустим в командной строке. Например: «-t -r», здесь «-» это разделитель, а «t» и «r» ключи. Класс должен содержать методы: OnUsage — выводит подсказку с форматом командной строки, OnSwitch — отрабатывает команду для каждого найденного ключа, Parse — разбор командной строки
Ограничить вывод параметров командной строки
Здравствуйте, уважаемые джависты! У меня задача такая. Нужно вывести параметры командной строки.
Реализация в виде консольного приложения с разбором параметров командной строки
Добрый день! У меня есть программа, написанная на языке java с помощью IntelliJ IDEA. В данной.
Обработка параметров командной строки
Обеспечить обработку параметров командной строки для определения режима работы программы: параметр.
Прочитать аргумент командной строки и добавить в него пробелы, чтобы длинна строки равнялась заданному числу
Прочитать аргумент командной строки и добавить в него пробелы так, чтобы длинна строки равнялась.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
public class ComLineParser { private String[] keys; private String[] delimeters; public enum SwitchStatus { NoError, Error, ShowUsage }; public ComLineParser(String[] keys) { this(keys, new String[] { "/", "-" }); } public ComLineParser(String[] keys, String[] delimeters) { this.keys = keys; this.delimeters = delimeters; } public void OnUsage(String errorKey){ if (errorKey != null) System.out.println("Command-line switch error:" + errorKey); System.out.println("формат ком.строки: имяПрограммы [-r] [-w]"); System.out.println(" -? показать Help файл"); System.out.println(" -r задать имя входного файла"); System.out.println(" -w выполнить вывод в указанный файл"); } public SwitchStatus OnSwitch(String key, String keyValue) { System.out.println(key+" "+keyValue); return SwitchStatus.NoError; } public Boolean Parse(String[] args) { SwitchStatus ss = SwitchStatus.NoError; int argNum; for (argNum = 0; (ss == SwitchStatus.NoError) && (argNum args.length); argNum++) { boolean isDelimeter = false; for (int n = 0; !isDelimeter && (n delimeters.length); n++) { isDelimeter = args[argNum].regionMatches(0,delimeters[n], 0, 1); } if (isDelimeter) { Boolean isKey = false; int i; for (i = 0; !isKey && (i keys.length); i++) { isKey = args[argNum].toUpperCase().regionMatches(1, keys[i].toUpperCase(),0,keys[i].length()); if (isKey) break; } if (!isKey) { ss = SwitchStatus.Error; break; } else { ss = OnSwitch(keys[i].toLowerCase(), args[argNum].substring(1 + keys[i].length())); } } else { ss= SwitchStatus.Error; break; } } if (ss == SwitchStatus.ShowUsage) OnUsage(null); if (ss == SwitchStatus.Error) OnUsage((argNum == args.length) ? null : args[argNum]); return ss == SwitchStatus.NoError; } }
Интерфейсы командной строки Java (часть 2): args4j
В моем предыдущем посте я рассмотрел синтаксический анализ аргументов командной строки в приложениях Java с использованием Apache Commons CLI . В этом посте я расскажу о том же, используя другую библиотеку: args4j .
args4j использует другой подход к указанию того, какие аргументы командной строки должно ожидать приложение Java, чем тот, который используется CLI Commons. В то время как CLI Commons ожидает, что объекты, представляющие параметры, будут создаваться индивидуально и явно, args4j использует пользовательские аннотации для облегчения этого «определения» этапа обработки аргументов командной строки. Ожидается, что параметры командной строки будут полями уровня экземпляра в классе и аннотируются аннотацией @ org.kohsuke.args4j.Option . Характеристики каждого аргумента командной строки включены в качестве атрибутов этой аннотации @Option .
Простое приложение, продемонстрированное в этом посте, аналогично тому, которое использовалось в моем предыдущем посте, и фокусируется на необязательной и бесполезной опции -v для указания многословности и обязательной опции -f которая ожидает значение, представляющее путь и имя файла. Следующий листинг кода демонстрирует использование аннотации @Option @Option для установки этих аргументов командной строки в качестве аннотации для членов данных класса.
args4j Определение аргументов командной строки через аннотации @Option
@Option (name= «-f» , aliases= «—file» , usage= «Fully qualified path and name of file.» , required= true )
Как показано в приведенном выше листинге кода, легко указать название параметров, их использование и то, требуются ли они (по умолчанию не является обязательным). Наличие private модификатора выше делает очевидным, что это атрибуты, определенные на уровне класса. Поскольку static модификатора нет, мы видим, что это переменные экземпляра, которые были аннотированы.
Чтобы проанализировать параметры командной строки, нужно просто создать экземпляр CmdLineParser и передать аргументы командной строки его методу parseArguments (String…) :
Разбор аргументов командной строки в args4j
В только что показанной первой строке Java-кода this ссылка на экземпляр класса, в котором переменные-члены, показанные выше, определены и @Option аннотацией @Option . В этом случае я использовал this потому что тот же класс, который определяет эти параметры, является тем, который вызывает этот метод синтаксического анализа. Чтобы сделать это в том же классе, мне нужно было иметь экземплярный ( static ) метод с именем doMain определенный в классе и вызываемый main функцией класса (это показано в полном листинге кода в конце этого поста). Аргументы командной строки, полученные из функции main(final String[]) класса, представляют собой массив строк, передаваемых parseArguments(String[]) .
Следующие два снимка экрана демонстрируют применение описанного кода на основе args4j для анализа аргументов командной строки. На первом изображении показаны комбинации коротких и длинных опций для двух опций. Второе изображение показывает автоматическое сообщение о случае, когда требуемый аргумент командной строки не был предоставлен.
Важной особенностью библиотеки синтаксического анализа командной строки является возможность отображения информации об использовании или помощи. Следующий листинг кода демонстрирует пример этого с помощью метода args4j CmdLineParser.printUsage (OutputStream) .