`
younglibin
  • 浏览: 1212118 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java交互式命令行调研

 
阅读更多

 

https://code.google.com/p/cliche/     jar 包 见附件

 

 

jline   jar  ,好像是  hive  的命令行 也使用了,http://jline.sourceforge.net

 

以下是引用别人的信息:

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函数的参数指定了命令行提示符:

Java代码  收藏代码
  1. ConsoleReader reader = new ConsoleReader();  
  2. 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。

      以下是个简单的例子:

Java代码  收藏代码
  1. ConsoleReader reader = new ConsoleReader();  
  2. List<Completor> completors = new ArrayList<Completor>();  
  3. completors.add(new SimpleCompletor(new String[]{"abc""def"}));  
  4. completors.add(new FileNameCompletor());  
  5. completors.add(new ClassNameCompletor());  
  6. completors.add(new NullCompletor());  
  7. reader.addCompletor(new ArgumentCompletor(completors));  
  8. 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等。

 

分享到:
评论

相关推荐

    Python-PythonPromptToolkit使用Python建立交互式命令行的库

    Python Prompt Toolkit是一个强大的库,专为使用Python构建交互式命令行应用而设计。它提供了丰富的功能,让开发者能够创建高效、美观且用户友好的命令行界面。本文将深入探讨这个库的核心特性、如何使用以及其在...

    基于Linux由C语言编写的交互式命令行库,可以自定义命令组.zip

    基于Linux由C语言编写的交互式命令行库,可以自定义命令组

    常见的交互式命令行用户界面的集合。-Node.js开发

    Inquirer.js常见的交互式命令行用户界面的集合。 目录文档安装示例方法对象问题答案分隔符Inquirer.js常见的交互式命令行用户界面的集合。 目录文档安装示例方法对象问题答案分隔符提示类型用户界面和布局React性...

    java 聊天工具 命令行版

    总结来说,这个“Java聊天工具命令行版”项目是一个学习网络编程、多线程以及命令行交互的好案例。通过分析和重构这样的代码,开发者可以深化对Java核心特性的理解,同时也能掌握如何利用这些知识来构建实际的软件...

    Go-Gosetup是一个简单的交互式命令行工具用于搭建一个Go工作空间

    1. **交互式命令行界面**: Gosetup通过用户友好的交互式界面,引导用户输入必要的信息,如项目名称、作者信息等,从而自动生成项目结构。 2. **自动配置GOPATH**: GOPATH是Go语言的一个环境变量,用于指定工作空间...

    Cliffy是一个用于制作交互式命令行界面的简单而强大的工具

    Cliffy就是这样一个专门用于创建交互式命令行界面的工具,尤其适合Node.js开发环境。下面将详细介绍Cliffy的功能、用法以及如何利用它来提升你的命令行应用。 Cliffy是一个基于Node.js的库,它的设计目标是简化CLI...

    interact:Dart的交互式命令行组件的集合

    相互作用可定制的交互式命令行组件的集合。目录执照 概述该库包含许多易于使用和可自定义的命令行组件,包括文本和密码输入,单选或选择输入,复选框或多个选择输入,微调框和进度条。 在example文件夹中可以找到...

    C# 编写命令行交互工具——实时输出_获取执行结果

    在C#编程中,创建命令行交互工具是一项常见的任务,特别是在系统级脚本或自动化流程中。本篇文章将深入探讨如何使用C#编写一个能够实时输出并获取执行结果的命令行工具。首先,我们需要理解命令行接口(CLI)的基本...

    通过JAVA执行命令行程序

    在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如运行命令行程序。这通常是通过Java的Runtime类或ProcessBuilder类来实现的。本文将详细讲解如何通过Java执行命令行程序,以及在处理...

    ask:deno的交互式命令行提示符

    问交互式命令行提示输入Deno。目录描述ask是一个漂亮的杰诺模块,允许您创建交互式命令行应用程序,类似于你与实现在Node.js的目前,此模块尚处于开发初期,所以请不要指望它支持查询者所做的一切。概述支持的提示:...

    cmd2:cmd2-使用Python快速构建功能丰富且用户友好的交互式命令行应用程序

    cmd2:用于构建交互式命令行应用程序的工具 cmd2是用于在Python中构建交互式命令行应用程序的工具。 它的目标是使开发人员快速轻松地构建功能丰富且用户友好的交互式命令行应用程序。 它提供了一个简单的API,它是...

    使用 Java 开发的命令行游戏.zip

    《使用Java开发的命令行游戏》是一个非常适合初学者和有一定经验的Java开发者进行实践和学习的项目。这个项目的核心在于利用Java语言构建一个基于文本界面的冒险类游戏,旨在提升编程技能,理解面向对象编程(OOP)...

    Java命令行classpath的设置

    Java命令行classpath(类路径)的设置是Java开发过程中的一项基础操作,对于理解和运行Java程序至关重要。类路径是指定Java虚拟机(JVM)在执行Java程序时查找类文件的位置。正确配置类路径能确保JVM能够找到并加载...

    jmxterm:交互式命令行JMX客户端

    **jmxterm** 是一个轻量级的、交互式的命令行工具,用于与支持JMX的应用程序进行通信。通过jmxterm,用户可以执行MBean操作、查询JMX属性和通知,无需编写任何代码,极大地简化了对Java应用程序的管理任务。 **交互...

    acli:用于管理ACL的交互式命令行

    用于管理ACL的交互式命令行。 文献资料 Node,Mysql,Redis的访问控制列表 用法 创建一个config.json文件并填写以下值: { "redis" : { "host" : "127.0.0.1" , "port" : 6379 } , "mysql" : { "ttt" : { ...

    Java 命令行应用开发

    首先,开发Java命令行应用需要对Java编程基础有深入理解,包括类、对象、数据类型、控制结构(如循环和条件语句)、异常处理等。这些是所有Java程序的基础,无论其是否运行在命令行环境。 其次,要创建命令行应用,...

    基于java的的命令行进度条 JCmdLineProgess.zip

    总的来说,JCmdLineProgress是一个方便的Java库,它简化了在命令行界面创建动态进度条的过程,帮助开发者提升其应用程序的交互性和用户体验。通过理解其核心原理和使用方式,我们可以更有效地在命令行应用中集成这种...

    jira-console:Jira交互式命令行界面,可批量处理并加快工作流程

    吉拉·康索尔(JiraConsole) Jira交互式命令行界面,可批量处理并加快工作流程。特色功能查看问题。 创建一个新的问题,然后输入他们的字段。 创建一个新版本。 在电路板上批量发行过渡。 批量编辑问题字段。 支持...

    python-prompt-toolkit:用于在Python中构建功能强大的交互式命令行应用程序的库

    prompt_toolkit是一个库,用于在Python中构建功能强大的交互式命令行应用程序。 阅读的。 注意:prompt_toolkit 3.0 请注意,该分支是prompt_toolkit 3.0分支。 对于大多数用户,它应该与prompt_toolkit 2.0兼容...

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

    Java命令行交互输入库JLine是开发者在编写需要接收用户命令行输入的Java程序时,常用的工具库。它提供了一套完整的解决方案,包括历史记录、自动补全、多路复用器等功能,极大地提升了用户与Java命令行应用程序的...

Global site tag (gtag.js) - Google Analytics