nighty

          折騰的年華
          posts - 37, comments - 143, trackbacks - 0, articles - 0

          關(guān)于Java命令行交互方式

          Posted on 2008-05-23 09:41 寒武紀(jì) 閱讀(4140) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Java
             普通的程序交互方式有命令行和GUI形式。對(duì)于GUI樣式,交互的設(shè)計(jì)可以多種多樣,但是Java做命令行交互,似乎存在著一些不足。
             命令行交互是傳統(tǒng)的交互方式,如果程序有時(shí)候需要在Unix或是Linux等系統(tǒng)上運(yùn)動(dòng)時(shí),以這種方式出現(xiàn)的可能性就比較大。命令行包括
             輸入和回顯問(wèn)題,一般是以行結(jié)束,或是以某個(gè)結(jié)束符為終命令終止標(biāo)識(shí)。System.out 和System.err就用于標(biāo)準(zhǔn)的輸出和錯(cuò)誤輸出,System.in用于標(biāo)準(zhǔn)的輸入接受,一般情況下都是指鍵盤(pán)。
             如果接受參數(shù)輸入,一般的程序結(jié)構(gòu)如下:
            
          BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
          System.out.println(
          "==Please input password==:");
          String pass 
          = in.readLine();
             輸入的時(shí)候顯示屏自動(dòng)進(jìn)行輸入回顯。這個(gè)時(shí)候如果遇到輸入密碼等敏感數(shù)據(jù)的時(shí)候,就無(wú)法用*或是#這樣的符號(hào)進(jìn)行回顯屏蔽,容易暴露安全問(wèn)題。
             解決的可能想法:
             1.  通過(guò)監(jiān)聽(tīng)鍵盤(pán)事件,對(duì)輸入的回顯進(jìn)行截獲取,把回顯進(jìn)行屏蔽,但是監(jiān)聽(tīng)器如何知道何時(shí)是輸入密碼,何時(shí)是輸入普通數(shù)據(jù)?比較難以控制,而且這種監(jiān)聽(tīng)?wèi)?yīng)該是線程化的,可能會(huì)存在一些意想不到的問(wèn)題。
             2.  如果用純Java難以實(shí)現(xiàn),那么是否可以使用其它語(yǔ)言的功能進(jìn)行補(bǔ)充,比如JNI,或是Windows下面的Dos腳本,Linux平臺(tái)的Shell腳本來(lái)進(jìn)行補(bǔ)充。不過(guò)這樣就不太平臺(tái)無(wú)關(guān)了。
             3.  可能sun發(fā)現(xiàn)了這個(gè)不足之處,從1.6版本開(kāi)始,增加了一個(gè)java.io.Console類(lèi),代表與當(dāng)前 Java 虛擬機(jī)關(guān)聯(lián)的基于字符的控制臺(tái)設(shè)備,這個(gè)Console是對(duì)原來(lái)System.in這種不足的補(bǔ)充,提供了像readPassword()等這樣的實(shí)用方法,具體請(qǐng)參考API文檔,就是專(zhuān)門(mén)用于對(duì)敏感信息的讀取。但是這是基于Java1.6的,如果有些場(chǎng)景受限制,不能使用1.6,那么還是無(wú)法解決上面的問(wèn)題。后來(lái)查閱了一下Console類(lèi)的實(shí)現(xiàn)方式,想直接把它的實(shí)現(xiàn)方式移植到1.4.xx上是比較難的,因?yàn)橛玫搅艘恍└甙姹镜男绿匦浴J褂肅onsole要注意的是:虛擬機(jī)是否具有控制臺(tái)取決于底層平臺(tái),還取決于調(diào)用虛擬機(jī)的方式。如果虛擬機(jī)從一個(gè)交互式命令行開(kāi)始啟動(dòng),且沒(méi)有重定向標(biāo)準(zhǔn)輸入和輸出流,那么其控制臺(tái)將存在,并且通常連接到鍵盤(pán)并從虛擬機(jī)啟動(dòng)的地方顯示。如果虛擬機(jī)是自動(dòng)啟動(dòng)的(例如,由后臺(tái)作業(yè)調(diào)度程序啟動(dòng)),那么它通常沒(méi)有控制臺(tái)。如果你在Eclipse里面啟動(dòng)程序調(diào)用Console,那么通常是沒(méi)有控制臺(tái),還是得從外部的命令行方式才能調(diào)用得到。
             總體想一下,感覺(jué)應(yīng)該還是從第2點(diǎn)出發(fā),犧牲掉一點(diǎn)通用性,這樣才能滿(mǎn)足這種功能需求。

          剛進(jìn)場(chǎng)的時(shí)候戲就落幕

          Feedback

          # re: 關(guān)于Java命令行交互方式  回復(fù)  更多評(píng)論   

          2008-05-23 11:39 by 魔域私服
          http://www.zhaomysf.com.cn
          http://www.wmsifu.cn
          http://www.888807.com
          主站蜘蛛池模板: 青岛市| 化德县| 阿城市| 乌恰县| 湘西| 中山市| 轮台县| 普陀区| 夏邑县| 泸水县| 苏尼特右旗| 本溪市| 利川市| 施甸县| 册亨县| 若尔盖县| 赤水市| 黎平县| 广平县| 兴海县| 弥勒县| 河南省| 镇江市| 宁夏| 湘乡市| 招远市| 阜宁县| 汽车| 蚌埠市| 乃东县| 泰来县| 剑河县| 怀安县| 句容市| 镇坪县| 拜城县| 青阳县| 广宁县| 泾阳县| 乌什县| 平利县|