Java GNU GetOpt:了解LongOpt的StringBuffer标志

时间:2019-08-12 03:47:24

标签: java getopt

我不太了解LongOpt中第三个构造函数的用途。 overview描述如下:

  

如果LongOpt对象中代表long选项的标志字段为非null,则将整数值字段存储在其中,并将整数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的“短格式”放在{{ 1}}到StringBuilder对象--outputdir中。从该StringBuilder选项中提取char可以使您看到它是哪个长选项,并知道如何使用该选项的参数。

一些问题:

  • 我的理解是否正确?
  • 为什么要使用存储字符的StringBuilder?为什么不只使用常规字符串并在其中加上完整的长选项名称,即sb
  • 为什么在长选项字符串上没有switch语句匹配?即outputdir。这是因为无法打开String时该库是在JDK 7之前编写的吗?然后,长选项可以像短选项一样进行匹配。

1 个答案:

答案 0 :(得分:0)

经过研究,我可以澄清自己的问题

  

我的理解是否正确?

我认为它是基于实验的。但是对于以后阅读此书的任何人都可以进行更正。

  

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

     

为什么长语句字符串上的switch语句不匹配?即输出目录。这是因为无法打开String时该库是在JDK 7之前编写的吗?然后,长选项可以像短选项一样进行匹配。

是的,我可以找到的唯一回购的最后一次提交是8 years ago。因此,需要将匹配的选项提取到单个char中,以便在switch语句中使用。

我改用Apache Commons CLI了,它的API更简单