普通的程序交互方式有命令行和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ǔ)充,提供了像
總體想一下,感覺(jué)應(yīng)該還是從第2點(diǎn)出發(fā),犧牲掉一點(diǎn)通用性,這樣才能滿(mǎn)足這種功能需求。
剛進(jìn)場(chǎng)的時(shí)候戲就落幕
命令行交互是傳統(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)如下:



解決的可能想法:
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í)候戲就落幕