您的位置 首页 java

java命令行程序交互也可以很nice

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();
    }
}
  

最后

最后希望大家喜欢,享受编程带来的乐趣。

文章来源:智云一二三科技

文章标题:java命令行程序交互也可以很nice

文章地址:https://www.zhihuclub.com/193618.shtml

关于作者: 智云科技

热门文章

网站地图