java

JLine

2018-01-14  本文已影响1383人  南桥畂翊

Overview

JLine 是一个用来处理控制台输入的Java类库,目前最新的版本是0.9.94。其官方网址是https://jline.github.io。在介绍JLine之前,首先还是介绍一下Java中的Console类,以便进行对比。

Java Console

通过调用System.console()方法可以得到与当前虚拟机对应的Console对象。但是该方法并不保证其返回值一定非null,这取决于底层平台和虚拟机启动的方式:如果是通过交互式的命令行启动,并且标准输入和输出流没有被重定向,那么该方法的返回值通常是非null;如果是被自动启动(例如cron)或者通过Eclipse启动,那么返回值通常为null。

Console类支持的功能有限,其中一个比较有用的功能是以非回显(echo)的方式从控制台读取密码。

JLine

JLine不依赖任何core Java以外的类库,但是其不是纯Java的实现。

ConsoleReader reader = new ConsoleReader();  
String line = reader.readLine(">");  

Features

Command History

通过按下键盘的上下箭头键,可以浏览输入的历史数据。此外JLine也支持终端快捷键,例如Ctrl+A, Ctrl+W,Ctrl+K, Ctrl+L等等,使用的时候非常便捷。
可以通过ConsoleReadersetUseHistory(boolean useHistory)方法启用/禁用Command History功能。ConsoleReaderhistory成员变量负责保存历史数据,默认情况下历史数据只保存在内存中。如果希望将历史数据保存到文件中,那么只需要以File对象作为参数构造History对象,并将该History对象设置到ConsoleReader即可。

Character Masking

ConsoleReader提供了一个readLine(final Character mask)方法,用来指定character mask。如果参数为null,那么输入的字符正常回显;如果为0,那么不回显;否则回显mask指定的字符。

Tab Completion

JLine中跟自动补全相关的接口是Completor,它有以下几个实现:

以下是个简单的例子:

ConsoleReader reader = new ConsoleReader();  
List<Completor> completors = new ArrayList<Completor>();  
completors.add(new SimpleCompletor(new String[]{"abc", "def"}));  
completors.add(new FileNameCompletor());  
completors.add(new ClassNameCompletor());  
completors.add(new NullCompletor());  
reader.addCompletor(new ArgumentCompletor(completors));  
reader.readLine(">");  

以上例子中首先在命令行上键入a,然后按下TAB后会自动补全第一个属性abc;然后键入空格,再按下TAB会进行文件名的自动补全;再键入空格和按下TAB后会进行类名的自动补全; 再键入空格和按下TAB后不再有自动补全。需要注意的是,ArgumentCompletor会对命令行上所有索引超过completors长度的属性使用completors中最后一个元素指定的Completor。如果要禁用这个行为,那么将completors的最后一个元素设置为NullCompletor对象。

Custom Keybindings

通过创建 HOME/.jlinebindings.properties文件(或者制定 jline.keybindings 系统变量),可以定制keybindings。

上一篇下一篇

猜你喜欢

热点阅读