首页 > 解决方案 > Java GNU GetOpt:了解 LongOpt 的 StringBuffer 标志

问题描述

我不太明白LongOpt中第三个构造函数的目的。概述描述如下:

如果 LongOpt 对象中表示长选项的标志字段不为空,则将整数值字段存储在那里,并将整数 0 返回给调用者。

从上面的例子中摘录来指导我在下面的观察/问题:

 LongOpt[] longopts = new LongOpt[3];
 // 
 StringBuffer sb = new StringBuffer();
 longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h');
 longopts[1] = new LongOpt("outputdir", LongOpt.REQUIRED_ARGUMENT, sb, 'o'); 
 longopts[2] = new LongOpt("maximum", LongOpt.OPTIONAL_ARGUMENT, null, 2);
// ...
// See overview link above for full example
// ..
while ((c = g.getopt()) != -1)
  switch (c)
    case 0:
      arg = g.getOptarg();
      System.out.println("Got long option with value '" +
                     (char)(new Integer(sb.toString())).intValue()
                     + "' with argument " +
                     ((arg != null) ? arg : "null"));
      break;
      // ... Rest of example

因此,在遍历选项时,您将返回 0。当然,这并不能告诉您我们点击了哪个选项,因此我们将上述长选项的“短格式”o放入--outputdirStringBuilder 对象中sb。从该 StringBuilder 选项中提取字符可以让您查看它是哪个长选项,并知道如何处理该选项的参数。

一些问题:

标签: javagetopt

解决方案


经过一些研究,我可以为自己的问题提供一些清晰的信息

我上面的理解正确吗?

我认为这是基于实验。但是对于将来阅读此内容的任何人都可以进行更正。

为什么使用 StringBuilder 存储字符?为什么不只是有一个常规字符串并在其中放置完整的长选项名称,即 outputdir 呢?

为什么不让长选项字符串上的 switch 语句匹配?即输出目录。这是因为当您无法打开字符串时,该库是在 JDK 7 之前编写的?然后可以像空头期权一样匹配多头期权。

是的,我能找到的唯一 repo 的最后一次提交是8 年前。因此需要将匹配的选项提取到单个char以在 switch 语句中使用。

相反,我转而使用具有更简单 API 的Apache Commons CLI


推荐阅读