java的控制台输入是很局限的,我们仅仅可得到它的输入,对于输入的过程是很难操控的,所以当我们想写一个人性化的输入体验的时候,是比较难实现的。还好java中有种jni的技术,它允许Java代码和其他语言写的代码进行交互。
Jline就是一个使用了C/C++实现的java类库,它可以让你更方便的处理控制台输入。
引入Jline,使用下面的maven配置
jline
jline
2.9
我们平常处理输入一般是这样的:
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之后,一样的书写形式:
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接口实现类
public interface Completer
int complete(String buffer, int cursor, List candidates);
}
其中buffer是当前用户输入的内容,cursor表示光标的位置,candidates表示你想补全的候选项。返回值很重要,表示你要再哪个位置补全你的内容
假设用户的输入是ls my xxxxxx
目前用户的光标在my后面,你想帮用户补全为myfoler或者myfile。你要这么写:
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对象即可:
MyCompleter myCompleter = new MyCompleter();
reader.addCompleter(myCompleter);
如果你的candidates有多个候选项,它会帮你列举出来,如果只有一个,它会帮你自动补全,当你的候选项都是xxx开头的,它会帮你补全一部分。
反正功能和vi,eclipse等ide里的自动补全功能一样强大。
Jline还有好多功能,例如获取历史,快捷键,移动光标,清屏等功能,它很强大,你只要知道有这么个东西,再去看看代码,看看它的成员方法,什么都是可以解决的,这里就不再赘述了。