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函数的参数指定了命令行提示符:
- 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等。
相关推荐
基于 Kotlin 的常见交互式命令行用户界面集合
Python Prompt Toolkit是一个强大的库,专为使用Python构建交互式命令行应用而设计。它提供了丰富的功能,让开发者能够创建高效、美观且用户友好的命令行界面。本文将深入探讨这个库的核心特性、如何使用以及其在...
基于Linux由C语言编写的交互式命令行库,可以自定义命令组
基于Linux由C语言编写的交互式命令行库,可以自定义命令组实现Interactive_comman_NiceCmdline
在标题“JavaScript_常见的交互式命令行用户界面的集合.zip”中,我们可以推测这个压缩包可能包含了一些用于创建交互式命令行用户界面(CLI)的JavaScript库和工具。这种界面允许用户通过文本输入与程序进行交互,...
1. **交互式命令行界面**: Gosetup通过用户友好的交互式界面,引导用户输入必要的信息,如项目名称、作者信息等,从而自动生成项目结构。 2. **自动配置GOPATH**: GOPATH是Go语言的一个环境变量,用于指定工作空间...
该项目是一款基于JavaScript编写的贝壳二手房/新房交互式命令行爬虫程序源码,集成了26个文件,包括14个JavaScript文件、6个JSON文件、1个EditorConfig文件、1个GitIgnore文件、1个npmrc文件、1个LICENSE文件、1个...
Inquirer.js常见的交互式命令行用户界面的集合。 目录文档安装示例方法对象问题答案分隔符Inquirer.js常见的交互式命令行用户界面的集合。 目录文档安装示例方法对象问题答案分隔符提示类型用户界面和布局React性...
**Node.js-diffy:构建基于diff的交互式命令行工具框架** `diffy` 是一个专门为 Node.js 开发者设计的小型框架,它旨在帮助创建基于 diff 的交互式命令行工具。在软件开发中,diff(差异)是用于比较两个文本文件或...
总结来说,这个“Java聊天工具命令行版”项目是一个学习网络编程、多线程以及命令行交互的好案例。通过分析和重构这样的代码,开发者可以深化对Java核心特性的理解,同时也能掌握如何利用这些知识来构建实际的软件...
10. **用户交互**:命令行程序通常需要友好的用户界面,即使是在命令行环境下。这可能涉及到自定义的命令解析逻辑,以及错误消息的清晰显示。 11. **测试与调试**:为了确保程序的正确性,需要编写单元测试和集成...
go-ipfs播放go中的交互式命令行工具可以玩耍并了解go-ipfs
在这个场景下,"Node.js-⚖️✔️licensed"是一个专为Node.js项目设计的交互式命令行工具,它的主要功能是协助开发者选择并添加合适的开源许可证(licenses)到他们的项目中。 在开源软件的世界里,许可证是非常...
promptui - 交互式提示命令行应用程序
相互作用可定制的交互式命令行组件的集合。目录执照 概述该库包含许多易于使用和可自定义的命令行组件,包括文本和密码输入,单选或选择输入,复选框或多个选择输入,微调框和进度条。 在example文件夹中可以找到...
在C#编程中,创建命令行交互工具是一项常见的任务,特别是在系统级脚本或自动化流程中。本篇文章将深入探讨如何使用C#编写一个能够实时输出并获取执行结果的命令行工具。首先,我们需要理解命令行接口(CLI)的基本...
python
cmd2:用于构建交互式命令行应用程序的工具 cmd2是用于在Python中构建交互式命令行应用程序的工具。 它的目标是使开发人员快速轻松地构建功能丰富且用户友好的交互式命令行应用程序。 它提供了一个简单的API,它是...
《使用Java开发的命令行游戏》是一个非常适合初学者和有一定经验的Java开发者进行实践和学习的项目。这个项目的核心在于利用Java语言构建一个基于文本界面的冒险类游戏,旨在提升编程技能,理解面向对象编程(OOP)...
参考了java版的expect4j,expectj的原理,进行了极大的简化,可完成基本的功能: 1,运行java代码,执行交互式命令 2,sudo提权,自动输入密码(echo "password" | sudo -S mkdir /opt/test)