`
whitesock
  • 浏览: 478699 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

JLine

    博客分类:
  • SE
阅读更多

 Overview

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

 

2 Java Console

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

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

 

3 JLine

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

  • 在Windows平台下,JLine通过自带的.dll文件初始化终端。jline.jar中包含了jline32.dll和jline64.dll,在Windows平台上使用的时候, JLine会自动将其解压缩到临时目录并进行加载。
  • 在Unix或者Max OS X平台下,JLine通过stty命令初始化终端。例如通过调用stty -icanon min 1将控制台设置为character-buffered模式。以及通过调用stty -echo禁止控制台回显。在修改终端的属性之前,JLine会对终端的属性进行备份,然后注册一个ShutdownHook,以便在程序退出时进行恢复。由于JVM在非正常退出时(例如收到SIGKILL信号)不保证ShutdownHook一定会被调用,因此终端的属性可能无法恢复。

      JLine使用起来非常简单,jline.jar中一共只有20几个类,源码也不难懂。以下是个简单的例子,其中readLine函数的参数指定了命令行提示符:

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

3.1 Features

3.1.1 Command History

      通过按下键盘的上下箭头键,可以浏览输入的历史数据。此外JLine也支持终端快捷键,例如Ctrl+A, Ctrl+W,Ctrl+K, Ctrl+L等等,使用的时候非常便捷。

      可以通过ConsoleReader的setUseHistory(boolean useHistory)方法启用/禁用Command History功能。ConsoleReader的history成员变量负责保存历史数据,默认情况下历史数据只保存在内存中。如果希望将历史数据保存到文件中,那么只需要以File对象作为参数构造History对象,并将该History对象设置到ConsoleReader即可。


3.1.2 Character Masking

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


3.1.3 Tab Completion

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

  • SimpleCompletor: 对一系列指定的字符串进行自动补全。
  • FileNameCompletor: 类似于bash中的文件名自动补全。
  • ClassNameCompletor: 对classpath中出现的全路径类名进自动补全。
  • NullCompletor: 不进行自动补全。
  • ArgumentCompletor: 为每个属性使用指定的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对象。

 

3.1.4 Custom Keybindings

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

 

4 Known Issues

      JLine最知名的问题莫过于在Windows平台下的Eclipse中启动的程序中调用reader.readLine()方法时总是返回null(正确的行为是等待用户输入)。通过debug, 笔者发现通过设置jline.WindowsTerminal.directConsole属性为false,可以解决返回null的问题,但是感觉还是有些其它的问题。总之,笔者没有发现好的对策,只能work around,即对JLine再进行一层封装,在某些场景下仍然使用原始的基于System.in的流处理。

 

5 Usage

      想必很多项目都会为其应用做一层Application之类的抽象。对应用进行监控的常见方式是使用JMX,JMX从逻辑上可以认为是应用程序的一个Shell。笔者为项目中的Application提供了一套完整的Shell抽象,包括Shell、Console、 Process 和 Command等等。其中JLine是一种Console的具体实现。如果是后台应用,那么可以通过基于Socket的Console连接到应用,从而进行监控,例如停止应用程序等。如果前台的交互式应用,那么可以直接使用基于终端的Console实现, 例如笔者项目中为Spring Batch实现的CommandLine Scheduler等。

9
4
分享到:
评论
2 楼 whitesock 2010-06-18  
在读取命令行输入,并且需要类似bash等shell的命令行自动补全,命令历史,快捷键等特性时,可以考虑使用JLine。
1 楼 langyu 2010-06-18  
没发现有什么大的用途,楼主怎么解释下么

相关推荐

    jline-2.12-API文档-中文版.zip

    赠送jar包:jline-2.12.jar; 赠送原API文档:jline-2.12-javadoc.jar; 赠送源代码:jline-2.12-sources.jar; 赠送Maven依赖信息文件:jline-2.12.pom; 包含翻译后的API文档:jline-2.12-javadoc-API文档-中文...

    jline-2.11-API文档-中文版.zip

    赠送jar包:jline-2.11.jar; 赠送原API文档:jline-2.11-javadoc.jar; 赠送源代码:jline-2.11-sources.jar; 赠送Maven依赖信息文件:jline-2.11.pom; 包含翻译后的API文档:jline-2.11-javadoc-API文档-中文...

    jline-2.12-API文档-中英对照版.zip

    赠送jar包:jline-2.12.jar; 赠送原API文档:jline-2.12-javadoc.jar; 赠送源代码:jline-2.12-sources.jar; 赠送Maven依赖信息文件:jline-2.12.pom; 包含翻译后的API文档:jline-2.12-javadoc-API文档-中文...

    jline-2.11-API文档-中英对照版.zip

    赠送jar包:jline-2.11.jar; 赠送原API文档:jline-2.11-javadoc.jar; 赠送源代码:jline-2.11-sources.jar; 赠送Maven依赖信息文件:jline-2.11.pom; 包含翻译后的API文档:jline-2.11-javadoc-API文档-中文...

    jline3, JLine是用于处理控制台输入的Java库.zip

    jline3, JLine是用于处理控制台输入的Java库 描述JLine是用于处理控制台输入的Java库。 it functionality editline和 GNU 类似,但是具有额外的特性,使之与 ZSH行编辑器 par 。 熟悉 readline/editline功能的现代 ...

    Java 命令行交互输入库 JLine需要的jar包

    JLine需要的jar包

    hadoop+hbase报错使用jar文件(jline-2.12.1.jar)

    jline版本低导致hbase启动失败,这里的jar文件完成升级。

    jline-2.9.1

    Hadoop2.6.0配合hive1.0.0版本,会报jline错误。原因是Hadoop/share/hadoop/yarn/lib中的jline是0.9版本的,存在问题。 换成jline-2.9.1版本,问题就可以解决了。就可以成功的使用hive了。

    jline3:JLine是一个用于处理控制台输入的Java库

    JLine JLine是一个用于处理控制台输入的Java库。 它的功能类似于和,但具有使其与同等的附加功能。 熟悉现代shell的readline / editline功能(例如bash和tcsh)的人会发现JLine的大多数命令编辑功能都很熟悉。 ...

    jline-1.0-8.el7.noarch.rpm

    离线安装包,亲测可用

    jline-2.11.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 ...

    jline-0.9.94.jar

    使用zookeeper需要引入的jar包,有需要的下载使用吧~~

    jline2:杰琳2.x

    描述JLine是一个用于处理控制台输入的Java库。 它的功能类似于和 。 熟悉现代shell的readline / editline功能(例如bash和tcsh)的人会发现JLine的大多数命令编辑功能都很熟悉。 JLine 2.x是的演变,以前是在维护的...

    com.springsource.jline-0.9.94.s2-a.jar

    jar包,官方版本,自测可用

    jline-0.9.93.jar

    JLine jline/jline/0.9.93/jline-0.9.93.jar

    jline-2.14.jar

    JLine jline/jline/2.14/jline-2.14.jar

    jline-2.14.1.jar

    JLine jline/jline/2.14.1/jline-2.14.1.jar

    jline-2.13.jar

    JLine jline/jline/2.13/jline-2.13.jar

Global site tag (gtag.js) - Google Analytics