处理命令行程序中的选项

时间:2016-11-15 05:42:51

标签: java

这是一个(新手)通用编程问题,而不是特定于Java的挑战。如果它有所作为,它是我的目标语言。

如何在操作期间使用可能具有多种组合的选项来理智地处理程序?

例如,假设我有一个可以按如下方式运行的音乐播放器命令行应用:muzak -s -v -a -i my_music_dir

*-s: shuffle *-r: replay once *-v: reverse playlist *-a: replay all (if -a and -r is active at the same time, -a overrides) *-i: ignore previously played (same opportunity for file to be replayed)

当我编写方法时,如何跟踪所有可能的选项?例如。对于具有相同起始顺序的列表,muzak -s -v my_music_dir会为muzak -v -s my_music_dir生成不同的播放列表。

3 个答案:

答案 0 :(得分:2)

如果您不想重新发明轮子,请使用Apache Commons CLI

import org.apache.commons.cli.*;

public class Main {
    public static void main(String args[]) {
        Options options = new Options();
        options.addOption("t", false, "display current time");
        CommandLineParser parser = new DefaultParser();
        try {
            CommandLine cmd = parser.parse(options, args);
            if(cmd.hasOption("t")) {
                System.out.println("-t is set");
            }
        }
        catch(ParseException exp) {}
    }
}

答案 1 :(得分:0)

你可以做一些像这样简单的事情。我采用命令行参数数组,检查它是否包含每个标志并相应地设置一个布尔值。

之后我可以使用我的布尔值使用if条件处理每个特殊情况。

public static void main(String[] args) {

    boolean replay = false;
    boolean replayAll = false;

    if (Arrays.asList(args).contains("-r")) {
        replay = true;
    }
    if (Arrays.asList(args).contains("-a")) {
        replayAll = true;
    }

    //handle special scenarios at the end
    if (replay && replayAll) {
        replay = false;
        //keep only replayAll true
    }

    System.out.println(replay); 
    System.out.println(replayAll);

}

因此,如果您执行java Music -r -a,结果将为:

repeat: false

repeatAll: true

答案 2 :(得分:0)

我建议你使用开关,因为这种方法很干净并且可以很好地扩展(新选项)

public static void main(String [] args){

选项选项=新选项();

for(String arg: args){ // iterate over all options
  if(arg == null) continue; // switch does not like nulls

  switch(arg){ // since JDK7 you can switch over Strings
   case "-r":
     options.setReplay(true); break; 
   case "-a" : 
     options.setReplayAll(true); break; 
   default:
     throw new ParseException("Unknown option: "+ arg)
  }
}

.... // rest of your code

}

至于其余的代码,我建议你创建一个类选项:

class Options{

  boolean replay = false;
  boolean replayAll = false;

  // getters and setters

  // other methods holding flag combinations, like:
  public boolean replayNone(){
   return !replay && ! replayAll;
  }
}