nighty

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

          關于Java命令行交互方式

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

          剛進場的時候戲就落幕

          Feedback

          # re: 關于Java命令行交互方式  回復  更多評論   

          2008-05-23 11:39 by 魔域私服
          http://www.zhaomysf.com.cn
          http://www.wmsifu.cn
          http://www.888807.com
          主站蜘蛛池模板: 夹江县| 湖口县| 堆龙德庆县| 叶城县| 闸北区| 惠来县| 资中县| 阳东县| 许昌县| 禹城市| 瑞安市| 灵山县| 汉源县| 吉林省| 庄浪县| 正阳县| 南雄市| 梨树县| 和政县| 哈密市| 宜黄县| 广南县| 吴江市| 巩义市| 和田市| 五大连池市| 米易县| 锡林浩特市| 凉城县| 兴城市| 胶州市| 黎川县| 新丰县| 错那县| 湟中县| 桐梓县| 那坡县| 桐柏县| 汾阳市| 天峻县| 潼南县|