[备忘] Java的文本控制台

2年前做过一个项目需要一个Java文本控制台, 这两天看到, 趁现在还有点印象记一下. 如果你用Java Console关键字去search, 大部分说的是JConsole(那是一个JDK自带的profile工具), 所以这个问题在网上不是很好找解决方法.

Java Console有两种运行方式, 一种是一次性命令行, 类似 ls 命令一样, 运行完就退出来, 还有一种是交互式, 最典型的就是Oracle SQLPlus, 除非你exit, 否则程序一直等待你输入命令, 处理命令.

我所讲的Java Console是指后面一种, 前一种我宁愿称之为Java Command Line.

Java Console一般会有四个框架层面的问题需要处理: 

1. 处理文本输入

2. 解析输入的命令行

3. 命令的处理和执行

4. 格式化输出

其中第一个问题最难处理, 因为Java在默认情况下处理不了特殊键, 比如你想用 Up Arrow key 象Linux一下回显上一条命令行, 想用 Left Arrow Key和退格键象Linux下的可以修正命令行中输错的字符. 这个就是提出一个很厉害的库 jline, 这个库用纯Java解决这个问题, 而不用任何JNI方式. 还有一种方式也可以解决这个问题: 见:

http://hi.baidu.com/dba_james/blog/item/fcf855076f5ac77d030881ac.html (rlwarp)

http://www.cyberciti.biz/faq/how-do-i-enable-sql-plus-up-and-down-arrow-keys/ (gqplus)

不过rlwarp和gqplus的方式会有因linux平台不同而需要编译C代码的问题, 这将Java的优势减少了很多.

有关jline, 它的example比较乱, 我还做了一些简化, 封装了一个自己的Console, 使用起来更方便.

第二个问题是怎么解析输入的命令行, 比较有名的还是apache CLI2, 功能类似C语言的getopt, 可以处理linux下的多种命令行风格.

比如 "tar xvf",  "ls --full-time", "ls -l", "cmd a=3 b=true", "copyfile dir1 dir2" 等.

第三个问题是命令的处理和执行,需要处理 command history, tab 自动完成, 命令别命, 还需要能方便地增加新的命令, 简单一点的plugin机制, 就是通过增加类(注意: 通过继承,不是修改现有类)来实现增加新命令. 复杂一点plugin机制可以用jar和配置文件的方式.

第四个问题, 这个主要难题是表格样式的输出, 需要根据所定宽度来处理内容的换行, 这有点象SQLplus的col命令.

smithfox | Saturday 26 February 2011 at 5:29 pm | | Java        | Used tags: ,

three comments

Santal

分析的真好,4个方面确实覆盖到了写一个控制台的各个角落。
补充点我的经验,想要锦上添花,不过也可能是白璧青蝇。
事实上JLine也不是纯靠Java来解决的,JDK本身没提供任何访问输入缓冲区的方法,所以纯Java的方案难以实现退格,移动光标等功能,JLine靠的还是一些系统级的方法,据我知道的JLine实现方法是,在Unix系统上启动了一个stty进程来处理输入,在Windows系统上,则靠的是一个dll。
关于解析命令行,我看到有系统中使用JavaCC或者是ANTLR 生产了一个语法分析器,这样就可以处理一些稍微复杂的情况,例如有自定义保留字的,可以定义变量的,等等这样的情况。用CLI2仅仅只能实现单行Shell命令的解析,非常弱,如果要做一个全功能的Console,稍显不够。还有另外一种玩法,是利用解释型脚本语言,比如说用JavaScript ,或者Jython,或者BeanShell之类的来完成命令的调用与管理,也够强大。

Santal, - 26-02-’11 23:42
smithfox

Santal大侠现身啦! 你说的是对的, 正是因为JLine是启动stty进程来实现的, 所以当kill -9(或是Control+C)强制结束Java console进程时, 因为没有机会做stty的恢复, Linux屏幕会出现怪异的现象: 比如光标消失,换行有空格之类的.

smithfox, (URL) - 27-02-’11 10:09
best iPhone 6 Cases

While the sidewall display and Touch ID display are both great ideas, what we really want to see is a higher resolution display. The iPhone 6 Plus’s display is 401ppi, but that’s still not as impressive as many of its rivals, including the Galaxy Note 4 and the LG G3.

best iPhone 6 Cases, (URL) - 04-06-’15 14:46
(optional field)
(optional field)
为阻止垃圾广告, 请在提交评论前, 回答一个简单问题(Please answer an simple question)
Remember personal info?
Notify
Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.