在不使用第三方库的情况下使用标志解析​​命令行 args[]

Parsing command line args[], with flags and without using a third party lib

我需要在不使用任何第三方库(如 Apache CLI or JCommander)的情况下解析 Java 应用程序中的一些命令行参数。我只能用标准的Java 11 API.

它们将在启动时通过标志传递到我的应用程序中;例如:java myClass -port 14008 -ip 140.086.12.12 可以是任何顺序。

我是 Java 的新手,但我该怎么做呢?任何标准 API 函数都可以帮助解决这个问题吗?或者我应该手动检查它们,例如:if arg[0] = "-port" then arg[0]+1 = port number.

命令行将用白色分隔 spaces 您将在“Java MyClass”之后编写的所有内容。因此,每个用 space 分隔的“单词”都将被视为一个参数。

您可能想将它们打包在一起,然后使用分隔符将它们拆分,就像这样 Java myClass -port:14008 -ip:140.086.12.12

或者,如果您想保留参数样式,您可能需要在括号内添加索引位移,如下所示

int port = 0;
String ip = "";
for (int i=0; i<args.length; i+=2){
    if (args[i].equals("port")){
       port = Integer.parseInt(args[i+1]);
    } else if (args[i].equals("ip")){
       ip = args[i+1];
    }
}

顺便说一句,这是一篇非常好的文章,它很快解释了 Java 如何接受命令行参数。您可能会发现它很有用。

https://www.baeldung.com/java-command-line-arguments

编辑:感谢@Andy Turner 的评论

我就是这样解决问题的。它假设有 class 个成员变量设置了默认值以覆盖。

private String ipAddress = "localhost";

private Integer port = 14001;

     /**
     * Method to get the ip and port number from the command line args.
     * It caters for any order of flag entry.It tries to override the
     * defaults set as a class variables, so if it can't, it uses those.
     *
     * @param args The args passed in by the user.
     */
    private void getPortAndIp(String[] args) {
        System.out.println("Getting inputs ");
        if ((args[0].equals("-ccp")) && (args.length == 2)) {
            this.port = Integer.parseInt(args[1]);
        } else if ((args[0].equals("-cca")) && (args.length == 2)) {
            this.ipAddress = args[1];
        } else if ((args[0].equals("-ccp")) && (args[2].equals("-cca"))
                && (args.length == 4)) {
            this.port = Integer.parseInt(args[1]);
            this.ipAddress = args[3];
        } else if ((args[0].equals("-cca")) && (args[2].equals("-ccp"))
                && (args.length == 4)) {
            this.port = Integer.parseInt(args[3]);
            this.ipAddress = args[1];
        } else {
            System.out.println("Options:");
            System.out.println("-ccp [port number]");
            System.out.println("-cca [ip address]");
            System.out.println("Could not determine port from command line " +
                    "arguments, using defaults: ");
        }
        System.out.println("on " + this.ipAddress + ":" + this.port);
    }