3

我正在编写一个 JAVA 控制台应用程序。用户启动 jar 后,他应该得到一个类似于 Linux shell 的命令行,他可以在其中输入命令。这是我以前从未编程过的东西。通常我正在编写 GUI,或者我用一些已解析的参数启动 jar。

基本上我有2个问题:

  1. 是否有第三方库可以帮助从命令行读取用户输入并解析命令并生成提示?解析在我通常由 Apache Commons CLI 使用的主类中传递的参数。它在这里也使用完整还是有更好的方法?
  2. 是否有提供“无限输入”的最佳实践?我发现的所有解决方案都有 10 年或更长时间,例如:

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

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

4

2 回答 2

5

我正在使用库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();
于 2016-03-13T12:30:11.437 回答
1

我也在构建一个带有类似命令行界面的应用程序。我设计我的方式是创建一个名为“命令”的类,它是所有命令的超类。制作 2 个抽象方法,“execute”和“getName()”。

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

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

获取用户输入,然后您可以通过迭代所有命令的列表来尝试将其与 command.getName() 方法匹配,而不是使用大量的大小写切换代码部分。否则会变得丑陋。

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

于 2016-03-12T01:22:41.043 回答