Как извлечь два пути из аргументов в командной строке Java? - PullRequest
0 голосов
/ 25 февраля 2019

Я делаю реализацию дерева Хаффмана, которая берет некоторые данные и печатает листья дерева или сериализует дерево в файл.Реализация использует пользовательскую программу командной строки, которая получает флаги, исходный путь (~/example/dir/source.txt) и выходной путь (~/example/dir/).Это выглядело бы как

mkhuffmantree -s -f ~/example/dir/source.txt ~/example/dir/ 

Я не использую инфраструктуру или библиотеку для передачи аргументов командной строки, я хочу сделать это вручную.Мое решение было:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
class mkhuffmantree
{ 
    boolean help = false;
    boolean interactive = false;
    boolean verbose = false;
    boolean serialize = false;
    boolean fromFile = false;
    File source;
    Path outputPath;

  public void readArgs(String[] args){
        for (String val:args) 
        if(val.contains(-h)){
            help = true;
        } else if(val.contains(-i)){
            interactive = true;
        } else if(val.contains(-v)){
            verbose = true;
        } else if(val.contains(-s)){
            serialize = true;
        } else if(val.contains(-f)){
            fromFile = true;
        }
    }

    public void main(String[] args){  
        if (args.length > 0){ 
            readArgs(args);            
        } 
    } 
} 

Но после интерпретации флагов я не знаю, как хранить ~/example/dir/source.txt в File source и ~/example/dir/ в Path outputPath

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете сделать что-то вроде этого:

        for (int i = 0; i < args.length; i++) {
            String val = args[i];

            if (val.contains("-h")) {
                help = true;
            } else if (val.contains("-i")) {
                interactive = true;
            } else if (val.contains("-v")) {
                verbose = true;
            } else if (val.contains("-s")) {
                serialize = true;
            } else if (val.contains("-f")) {
                fromFile = true;
                source = new File(args[++i]);
            }
        }

        outputPath = Paths.get(args.length - 1);

Также взгляните на Apache CLI

0 голосов
/ 25 февраля 2019

Вам нужно иметь состояние, когда вы читаете значения.

, чтобы начать с, я предлагаю вместо этого следующую команду:

mkhuffmantree -s -f ~/example/dir/source.txt -o ~/example/dir/ 

Затем, когда вы нажимаете -f, вы устанавливаетеНовая переменная, скажем, «nextParam» для SOURCE (может быть, enum? Может также быть конечным статическим значением типа int, например, 1), когда вы нажмете -o и установите для «nextParam» значение OUTPUT

Затем ДО вашего переключателя, но внутрицикл (не забудьте добавить скобки, которые вы уже должны были поставить после выражения for!), вы хотите что-то вроде:

if(nextParam == SOURCE) {
    fromFile = val;
    nextParam = NONE; // Reset so following params aren't sent to source
    continue;   // This is not a switch so it won't match anything else
}

повторить для OUTPUT

Другой способ сделать это:

Если вы не хотите использовать -o, есть другой подход, которому не нужны -f или -o, то есть поставить в нижнюю часть цикла for окончательный «else»«который помещает значение в« источник », если источник не имеет значения, в этом случае вы помещаете его в файл outputFile.

Если вы сделаете это таким образом, вы можете просто полностью избавиться от -f, это бессмысленно, посколькувы просто говорите, что два значения, которые не совпадают как SWIпредполагается, что tches - это ваши файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...