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 的常见交互式命令行用户界面集合
交互式命令行界面(Cisco风格)的仅跨平台标头的C ++ 14库 重要说明:重大的API更改cli 2.0版进行了重大更改,以添加更多功能。 要将您的应用程序迁移到新的cli版本,请参见此文件的“异步编程和调度程序”部分,...
《Inquirer.js——构建交互式命令行用户界面的利器》 在现代的开发环境中,命令行工具已经成为开发者不可或缺的一部分。特别是在Node.js生态系统中,利用其非阻塞I/O的特性,我们可以创建出强大的命令行应用。...
基于Linux由C语言编写的交互式命令行库,可以自定义命令组实现Interactive_comman_NiceCmdline
该项目是一款基于JavaScript编写的贝壳二手房/新房交互式命令行爬虫程序源码,集成了26个文件,包括14个JavaScript文件、6个JSON文件、1个EditorConfig文件、1个GitIgnore文件、1个npmrc文件、1个LICENSE文件、1个...
.NET Core NuGet软件包名称的框架的Sharprompt交互式命令行界面工具包目标框架NuGet Sharprompt .NET Standard 2.0 .NET Core NuGet软件包名称的框架的Sharprompt交互式命令行界面工具包目标框架NuGet Sharprompt ...
1. **交互式命令行界面**: Gosetup通过用户友好的交互式界面,引导用户输入必要的信息,如项目名称、作者信息等,从而自动生成项目结构。 2. **自动配置GOPATH**: GOPATH是Go语言的一个环境变量,用于指定工作空间...
航海家 创建简单的交互式命令行工具的框架。例子一个基本的Hello World示例>>> import navigator>>> nav = navigator.Navigator(intro="Welcome")>>> @nav.route('Hello World', "A simple Hello World")>>> def ...
在Java编程中,创建基于命令行的程序是一种基础但实用的技术。这主要涉及到对系统输入输出的处理,以及可能的参数解析。以下是一些关于如何使用Java编写命令行程序的关键知识点: 1. **主方法(Main Method)**: ...
go-ipfs播放go中的交互式命令行工具可以玩耍并了解go-ipfs
icli-交互式命令行界面 什么是icli icli是一个基于argparse构建的Python库,它使您可以快速构建具有部分,命令历史记录,命令批处理,命令重复和交互式自动完成功能的丰富的交互式命令行界面。 icli将readline库...
使用JCmdLineProgress库,开发者可以方便地在Java命令行程序中集成进度条,提高用户体验。通过实例化库提供的类,设置参数,然后在执行任务时调用相应的更新方法,就可以实现动态的进度显示。 例如,以下是一个简单...
《使用Java开发的命令行游戏》是一个非常适合初学者和有一定经验的Java开发者进行实践和学习的项目。这个项目的核心在于利用Java语言构建一个基于文本界面的冒险类游戏,旨在提升编程技能,理解面向对象编程(OOP)...
参考了java版的expect4j,expectj的原理,进行了极大的简化,可完成基本的功能: 1,运行java代码,执行交互式命令 2,sudo提权,自动输入密码(echo "password" | sudo -S mkdir /opt/test)
这种方式适用于简单的数据输入场景,但其灵活性较差,不适合复杂的交互式操作。 ##### 实现方式: 在Java程序中,主函数通常定义为`public static void main(String[] args)`。这里的`args`数组就是一个字符串数组...
一个交互式命令行程序,用于帮助解密代理加密消息。 用Java语言编写,需要Node.js。 启动程序并输入密文: node index.js Entrer le texte chiffré sans accents (les espaces et signes de ponctuations sont ...
最少的交互式命令行提示符 描述 轻巧且无任何外部依赖项qoa使您能够通过一组直观,交互式和冗长的命令行提示来接收各种类型的用户输入。 该库采用了一种简单且使用最少的语法,并包含7个可配置的控制台界面,例如纯...
首先,开发Java命令行应用需要对Java编程基础有深入理解,包括类、对象、数据类型、控制结构(如循环和条件语句)、异常处理等。这些是所有Java程序的基础,无论其是否运行在命令行环境。 其次,要创建命令行应用,...
软件包terminput提供了交互式命令行工具的终端键盘输入。 例 package main import ( "fmt" "log" "github.com/pkg/term" "github.com/tj/go-terminput" ) func main () { t , err := term . Open ( "/dev/tty...