亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

java交互式命令行調(diào)研

系統(tǒng) 2082 0

?

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

?

?

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

?

以下是引用別人的信息:

Overview

????? JLine 是一個用來處理控制臺輸入的Java類庫,目前最新的版本是0.9.94。其官方網(wǎng)址是http://jline.sourceforge.net。在介紹JLine之前,首先還是介紹一下Java 6中的Console類,以便進行對比。

?

2 Java Console

?? ?? 通過調(diào)用System.console()方法可以得到與當(dāng)前虛擬機對應(yīng)的Console對象。但是該方法并不保證其返回值一定非null,這取決于底層平臺和虛擬機啟動的方式:如果是通過交互式的命令行啟動,并且標(biāo)準(zhǔn)輸入和輸出流沒有被重定向,那么該方法的返回值通常是非null;如果是被自動啟動(例如cron)或者通過Eclipse啟動,那么返回值通常為null。

????? Console類支持的功能有限,其中一個比較有用的功能是以非回顯(echo)的方式從控制臺讀取密碼。

?

3 JLine

????? JLine不依賴任何core Java以外的類庫,但是其不是純Java的實現(xiàn)。

  • 在Windows平臺下,JLine通過自帶的.dll文件初始化終端。jline.jar中包含了jline32.dll和jline64.dll,在Windows平臺上使用的時候, JLine會自動將其解壓縮到臨時目錄并進行加載。
  • 在Unix或者Max OS X平臺下,JLine通過stty命令初始化終端。例如通過調(diào)用stty -icanon min 1將控制臺設(shè)置為character-buffered模式。以及通過調(diào)用stty -echo禁止控制臺回顯。在修改終端的屬性之前,JLine會對終端的屬性進行備份,然后注冊一個ShutdownHook,以便在程序退出時進行恢復(fù)。由于JVM在非正常退出時(例如收到SIGKILL信號)不保證ShutdownHook一定會被調(diào)用,因此終端的屬性可能無法恢復(fù)。

????? JLine使用起來非常簡單,jline.jar中一共只有20幾個類,源碼也不難懂。以下是個簡單的例子,其中readLine函數(shù)的參數(shù)指定了命令行提示符:

Java代碼?? 收藏代碼
  1. ConsoleReader?reader?=? new ?ConsoleReader();??
  2. String?line?=?reader.readLine( ">" );??

?

3.1 Features

3.1.1 Command History

????? 通過按下鍵盤的上下箭頭鍵,可以瀏覽輸入的歷史數(shù)據(jù)。此外JLine也支持終端快捷鍵,例如Ctrl+A, Ctrl+W,Ctrl+K, Ctrl+L等等,使用的時候非常便捷。

????? 可以通過ConsoleReader的setUseHistory(boolean useHistory)方法啟用/禁用Command History功能。ConsoleReader的history成員變量負(fù)責(zé)保存歷史數(shù)據(jù),默認(rèn)情況下歷史數(shù)據(jù)只保存在內(nèi)存中。如果希望將歷史數(shù)據(jù)保存到文件中,那么只需要以File對象作為參數(shù)構(gòu)造History對象,并將該History對象設(shè)置到ConsoleReader即可。


3.1.2 Character Masking

????? ConsoleReader提供了一個readLine(final Character mask) 方法,用來指定character mask。如果參數(shù)為null,那么輸入的字符正常回顯;如果為0,那么不回顯;否則回顯mask指定的字符。


3.1.3 Tab Completion

????? JLine中跟自動補全相關(guān)的接口是Completor,它有以下幾個實現(xiàn):

  • SimpleCompletor: 對一系列指定的字符串進行自動補全。
  • FileNameCompletor: 類似于bash中的文件名自動補全。
  • ClassNameCompletor: 對classpath中出現(xiàn)的全路徑類名進自動補全。
  • 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的最后一個元素設(shè)置為NullCompletor對象。

?

3.1.4 Custom Keybindings

????? 通過創(chuàng)建 HOME/.jlinebindings.properties文件(或者制定 jline.keybindings 系統(tǒng)變量),可以定制keybindings。

?

4 Known Issues

????? JLine最知名的問題莫過于在Windows平臺下的Eclipse中啟動的程序中調(diào)用reader.readLine()方法時總是返回null(正確的行為是等待用戶輸入)。通過debug, 筆者發(fā)現(xiàn)通過設(shè)置jline.WindowsTerminal.directConsole屬性為false,可以解決返回null的問題,但是感覺還是有些其它的問題。總之,筆者沒有發(fā)現(xiàn)好的對策,只能work around,即對JLine再進行一層封裝,在某些場景下仍然使用原始的基于System.in的流處理。

?

5 Usage

????? 想必很多項目都會為其應(yīng)用做一層Application之類的抽象。對應(yīng)用進行監(jiān)控的常見方式是使用JMX,JMX從邏輯上可以認(rèn)為是應(yīng)用程序的一個Shell。筆者為項目中的Application提供了一套完整的Shell抽象,包括Shell、Console、 Process 和 Command等等。其中JLine是一種Console的具體實現(xiàn)。如果是后臺應(yīng)用,那么可以通過基于Socket的Console連接到應(yīng)用,從而進行監(jiān)控,例如停止應(yīng)用程序等。如果前臺的交互式應(yīng)用,那么可以直接使用基于終端的Console實現(xiàn), 例如筆者項目中為Spring Batch實現(xiàn)的CommandLine Scheduler等。

?

java交互式命令行調(diào)研


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 奇米色在线 | 天天干天天插 | 手机看片福利盒子久久 | 欧美孕妇乱大交xxxxx | 99热久久这里只有精品6 | 最新国产麻豆精品 | 日本a视频 | 99re这里只有精品在线 | 国产一级特黄老妇女大片免费 | 九九影院理论片私人影院 | 久草日韩 | 国产午夜亚洲精品不卡福利 | 四虎avtom影院 | 国产九九精品 | 国产高清在线观看麻豆 | 久久久久久午夜精品 | 国产精品福利在线观看免费不卡 | 日本美女视频韩国视频网站免费 | 天天爱夜夜操 | 成人午夜大片 | 国产香蕉精品视频在 | 久久香蕉国产精品一区二区三 | 国产精品福利在线 | 久久青草免费91观看 | 欧美日本高清动作片www网站 | 中文字幕久久久久久久系列 | 国产欧美日韩免费一区二区 | 51毛片| 久久精品亚洲精品一区 | 欧美日韩国产在线 | 伊人久久丁香色婷婷啪啪 | 精品久久久久不卡无毒 | 大色香蕉色视频大全 | 亚洲一区二区三区免费在线观看 | 在线视频 二区 | 久久久噜噜噜www成人网 | 伊人在线 | 国产在线98福利播放视频免费 | 日韩一区二区三区在线观看 | 天天躁日日躁成人字幕aⅴ 天天躁日日躁狠狠躁黑人躁 | 日本1区2区|