Jline实现java输入自动补全

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还有好多功能,例如获取历史,快捷键,移动光标,清屏等功能,它很强大,你只要知道有这么个东西,再去看看代码,看看它的成员方法,什么都是可以解决的,这里就不再赘述了。

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 *