【问题标题】:How to parse some of the command line arguments to a single option in Java如何将一些命令行参数解析为 Java 中的单个选项
【发布时间】:2020-12-09 21:50:59
【问题描述】:

我了解如何直接解析命令行字符串以及使用 args4j 的选项。但我找不到如何将多个参数解析为单个选项。我的意思是这样的命令行:

java -jar myprog.jar -i firstFile secondFile thirdFile -o outputFile

所以基本上我想为输入选项传递未定义数量的参数。 谢谢。

【问题讨论】:

  • StringArrayOptionHandler 有帮助吗?
  • 如果您可以直接解析字符串,请考虑如何区分“-i”arg 和名为“-i”的文件(希望这会引导您了解一些 [啊哈,我将要求文件不是由...]) 的名称指定

标签: java parameter-passing command-line-arguments args4j


【解决方案1】:

我认为 args4j 做不到。我不会使用 args4j,它已经过时了。

试试jcommander。这是完全相同的想法,但与 args4j 不同,您可以将 jcommander 的 @Option 粘贴在 List<T> 上。请参阅文档的第 2.2 节(单击链接,转到 2.2。:P)

但是:请注意,如果我从字面上理解您的问题,那么您的问题是非常不可取的!

在 posix 风格的命令行参数中,你的字符串被解析为:

  • -i firstFile - 好的,firstFile 是 -i 选项的参数。
  • secondFile - 好的,这与 -i 完全无关,这是一个文件参数。
  • thirdFile - 同样的交易。
  • -o outFile - outFile 是 -o 开关的参数值。

您可能想要的以及 jcommander 的工作方式是您必须编写:

java -jar myprog.jar -i firstFile -i secondFile -i thirdFile -o outFile

如果你真的想让-i firstFile secondFile thirdFile 工作,那有点奇怪/非标准,当然,当需要非标准的东西时,标准库不太可能为你提供,所以你必须编写它全部手工。我建议您.. 稍微改变一下您想要的内容,以符合人们的期望,从而获得使用库为您获取它的好处。

然而,在命令行设计的这个兔子洞中走得更远,使用-i in1 -i in2 -i in3 会更好,但仍然不习惯且笨拙。通常的规则是通过无开关输入输入。编写命令行的正确方法是:

java -jar myprog.jar -o outFile firstFile secondFile thirdFile

这就是zipcurlffmpegjava(可执行文件)等本身的工作方式。

args4j 和 jcommander 都可以做到这一点; args4j 通过@Arguments List<String> args;,jcommander 通过@Parameter

【讨论】:

  • 谢谢,我会听从你的建议的!我检查了一些其他工具,它们根本没有输出开关,只使用最后一个参数作为输出。
【解决方案2】:

使用 arg4j,如果您想获得链接到“i”选项的列表,您可以使用 StringArrayOptionHandler

使用这个命令行:

java -jar myprog.jar -i firstFile secondFile thirdFile -o outputFile

执行此操作的源代码是:

class Main {

    @Option(name = "-i", handler = StringArrayOptionHandler.class)
    private List<String> files;

    @Option(name = "-o")
    private String outputFile;

    public static void main(String[] args) throws Exception {
        Main bean = new Main();
        CmdLineParser parser = new CmdLineParser(bean);
        parser.parseArgument(args);

        bean.files.stream().forEach(entry -> System.out.println(entry));
        System.out.println(bean.outputFile);
    }
}

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 2010-09-26
    • 2022-01-11
    • 2013-03-06
    相关资源
    最近更新 更多