具有自己提示的Java命令行应用程序

时间:2016-03-12 00:02:17

标签: java command-line-tool apache-commons-cli jline jline2

我正在编写一个JAVA-Console-Application。在用户启动jar后,他应该获得一个类似Linux shell的Commandline,在那里他可以输入命令。这是我以前从未编程的东西。 Normaly我正在编写GUI,或者我用一些被解析的Argu启动jar。

基本上我有两个问题:

  1. 是否有第三方库有助于从命令行读取用户输入来解析命令并生成提示?要解析主要类中传递的args,我通常使用Apache Commons CLI。它在这里使用是否充分,还是有更好的方法?
  2. 是否有提供“无限输入”的最佳做法?我找到的所有解决方案都是10年或更长时间,如:

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while(true){
        System.out.print("Enter String");
        String s = br.readLine();
    }
    

    这仍然是最佳做法还是今天有更好的方法?

2 个答案:

答案 0 :(得分:4)

我正在使用库jline2,即使用它就像这样简单:

    InputStream inStream = new FileInputStream(FileDescriptor.in);
    ConsoleReader reader = new ConsoleReader("App", inStream, System.out, null);

    reader.setPrompt("> ");

    reader.addCompleter(new FileNameCompleter());
    reader.addCompleter(new StringsCompleter(Arrays.asList(new String[] {
            "cmd1",
            "exit",
            "quit",
    })));

    String line;
    PrintWriter out = new PrintWriter(reader.getOutput());

    while ((line = reader.readLine()) != null) {
        if (line.startsWith("cmd1")) {
            String[] cmd = line.split("\\s+");
            if(cmd.length < 2) {
                out.println("Invalid command");
                help(out);
            } else {
                ... do work
            }
        } else if (line.equalsIgnoreCase("quit") || line.equalsIgnoreCase("exit")) {
            break;
        } else {
            help(out);
        }
    }

    // ensure that all content is written to the screen at the end to make unit tests stable
    reader.flush();

答案 1 :(得分:1)

我也在使用类似命令行的界面构建应用程序。我设计的方式是创建一个名为&#34;命令&#34;这是所有命令的超类。制作2个抽象方法,&#34;执行,&#34;和&#34; getName()&#34;。

然后,覆盖每个命令子类中的getName()方法,以便它将返回用户将作为字符串输入的命令。 (您不必使用getName(),任何其他方法名称都可以使用,或者您可以覆盖toString(),但这并不理想,因为它不会强制子类有自己的实施)

让另一个方法称为&#34;执行&#34;获取命令条目的其余部分(参数)和每个命令的逻辑。

获取用户输入,然后您可以尝试通过迭代所有命令的列表来匹配它与command.getName()方法,而不是使用巨大的case-switch代码段。否则会变得丑陋。

FWIW,我将控制台类作为Singleton,以便可以从应用程序的任何其他部分轻松访问它。