java的控制台输入是很局限的,我们仅仅可得到它的输入,对于输入的过程是很难操控的,所以当我们想写一个人性化的输入体验的时候,是比较难实现的。还好java中有种jni的技术,它允许Java代码和其他语言写的代码进行交互。
Jline就是一个使用了C/C++实现的java类库,它可以让你更方便的处理控制台输入。
引入Jline,使用下面的maven配置
1 2 3 4 5 | <dependency> <groupId>jline</groupId> <artifactId>jline</artifactId> <version>2.9</version> </dependency> |
我们平常处理输入一般是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 | BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; do { line = br.readLine(); if(line != null) { //todo } } while(line!=null && !line.equals("exist")) |
在使用了Jline之后,一样的书写形式:
1 2 3 4 5 6 7 8 9 10 11 | ConsoleReader reader = new ConsoleReader(); String line = null; do { line = reader.readLine("input>"); if(line != null) { //TODO } } while(line!=null && !line.equals("exist")) |
你便拥有了一个比较友好的输入体验了。它可以实现光标的移动,通过上下方向键切换历史命令等操作。
如果你希望有更强大的自动补全功能。你可以给ConsoleReader 设一个jline.console.completer.Completer接口实现类
1 2 3 | public interface Completer int complete(String buffer, int cursor, List<CharSequence> candidates); } |
其中buffer是当前用户输入的内容,cursor表示光标的位置,candidates表示你想补全的候选项。返回值很重要,表示你要再哪个位置补全你的内容
假设用户的输入是ls my xxxxxx
目前用户的光标在my后面,你想帮用户补全为myfoler或者myfile。你要这么写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class MyCompleter implements Completer { @Override public int complete(String buffer, int cursor, List candidates) { if(buffer.length() > 0 && cursor >0) { String substring = buffer.substring(0,cursor); if(substring.endsWith("my")) { candidates.add("myfolder"); candidates.add("myfile"); return cursor-2; } } return cursor; } } |
然后指定给comsoleReader对象即可:
1 2 | MyCompleter myCompleter = new MyCompleter(); reader.addCompleter(myCompleter); |
如果你的candidates有多个候选项,它会帮你列举出来,如果只有一个,它会帮你自动补全,当你的候选项都是xxx开头的,它会帮你补全一部分。
反正功能和vi,eclipse等ide里的自动补全功能一样强大。
Jline还有好多功能,例如获取历史,快捷键,移动光标,清屏等功能,它很强大,你只要知道有这么个东西,再去看看代码,看看它的成员方法,什么都是可以解决的,这里就不再赘述了。
除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址
本文地址:https://zhaoyanblog.com/archives/650.html