我正在编写一个JAVA-Console-Application。在用户启动jar后,他应该获得一个类似Linux shell的Commandline,在那里他可以输入命令。这是我以前从未编程的东西。 Normaly我正在编写GUI,或者我用一些被解析的Argu启动jar。
基本上我有两个问题:
是否有提供“无限输入”的最佳做法?我找到的所有解决方案都是10年或更长时间,如:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true){
System.out.print("Enter String");
String s = br.readLine();
}
这仍然是最佳做法还是今天有更好的方法?
答案 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,以便可以从应用程序的任何其他部分轻松访问它。