java命令行程序交互也可以很nice
如何nice
linux 和 mac 下很多命令行程序都可以参数快捷呼出和补全,可以方向键任意切换输入过的命令, 用起来就非常方便和nice,
比如mycli( python 实现的 mysql 客户端)。
分享
我一直也想用自己熟悉的java也实现类似命令行交互的命令行程序
请看下图:
实现
核心的实现是采用的 jar 包->jline.
添加依赖
通过 maven 依赖:
<dependency>
<groupId>jline</groupId>
<artifactId>jline</artifactId>
<version>2.9</version>
</dependency>
代码
原来的代码关联太多,做了一个简化版本当example,
关键代码:
List<Completer> completors = new LinkedList<Completer>();
//参数需要快捷呼出,需要在这里配置。
completors.add(new StringsCompleter(new String[] { "help", "head"," foreach ","dict","hidden" }));
reader.addCompleter(new ArgumentCompleter(completors));
具体example:
import jline.console.ConsoleReader;
import jline.console.completer.ArgumentCompleter;
import jline.console.completer.Completer;
import jline.console.completer.StringsCompleter;
import java .io.PrintWriter;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
public class Example {
public static ConsoleReader reader;
private static String PRE="[yuConsole]>";
public static void main(String[] args) {
try {
reader = new ConsoleReader();
reader.setBellEnabled(false);
List<Completer> completors = new LinkedList<Completer>();
//参数需要快捷呼出,需要在这里配置。
completors.add(new StringsCompleter(new String[] { "help", "head","foreach","dict","hidden" }));
reader.addCompleter(new ArgumentCompleter(completors));
PrintWriter out = new PrintWriter(System.out);
ConsolePrint.clear(out);
Example example = new Example();
String command;
while ((command = reader.readLine(PRE)) != null) {
if("exit".equals(command)){
break;
}
out.println(example.doAction(command));
out.flush();
}
out.println("yu's console say ByeBye!!!");
out.close();
System.exit(0);
} catch ( Exception e) {
e.printStackTrace();
}
}
public String doAction(String input) {
input=input.trim();
try{
String[] infos = input.split(" ");
Method m = this.getClass().getMethod(infos[0],String.class);
return (String) m.invoke(this,infos.length==1?"-":infos[1]);
}catch(Exception ex){
return "输入有误->"+help(input);
}
}
public String head(String input){
StringBuffer str = new StringBuffer();
str.append("head样式头");
return str.toString();
}
public String help(String input){
StringBuffer str = new StringBuffer();
str.append("help hsml例子");
str.append("head hsml样式头");
str.append("dict 获取字典表值");
str.append("hidden 隐藏");
str.append("foreach 循环");
return str.toString();
}
public String dict(String input){
StringBuffer str = new StringBuffer();
str.append("dict 字典值");
return str.toString();
}
public String hidden(String input){
StringBuffer str = new StringBuffer();
str.append("hidden 隐藏值");
return str.toString();
}
public String foreach(String input){
StringBuffer str = new StringBuffer();
str.append("foreach 循环");
return str.toString();
}
}
最后
最后希望大家喜欢,享受编程带来的乐趣。