程序一般從命令行運行,並在命令行環境中與用戶交互,Java平臺以兩種方式支持這種交互:經過標準流和控制檯。html
標準流是許多操做系統的一個特性,默認狀況下,它們從鍵盤讀取輸入並將輸出寫入顯示器,它們還支持文件和程序之間的I/O,但該功能由命令行解釋器控制,而不是程序。java
Java平臺支持三種標準流:標準輸入,可經過System.in
訪問;標準輸出,可經過System.out
訪問;和標準錯誤,經過System.err
訪問。這些對象是自動定義的,不須要打開,標準輸出和標準錯誤均用於輸出,單獨具備錯誤輸出容許用戶將常規輸出轉移到文件並仍然可以讀取錯誤消息,有關更多信息,請參閱命令行解釋程序的文檔。git
你可能但願標準流是字符流,但因爲歷史緣由,它們是字節流,System.out
和System.err
定義爲PrintStream對象,雖然從技術上講它是字節流,但PrintStream
利用內部字符流對象來模擬字符流的許多功能。github
相比之下,System.in
是一個沒有字符流功能的字節流,要將標準輸入用做字符流,請在InputStreamReader
中包裝System.in
。segmentfault
InputStreamReader cin = new InputStreamReader(System.in);
控制檯是標準流的更高級替代方案,這是一個類型爲Console的單獨、預約義的對象,它具備標準流提供的大部分功能,以及其餘功能。控制檯對於安全密碼輸入特別有用,Console
對象還經過其reader
和writer
方法提供真正的字符流的輸入和輸出流。api
在程序可使用控制檯以前,它必須經過調用System.console()
來嘗試檢索Console
對象,若是Console
對象可用,則此方法將返回該對象,若是System.console
返回NULL
,則不容許使用Console
操做,由於操做系統不支持它們,或者由於程序是在非交互式環境中啓動的。數組
Console
對象經過其readPassword
方法支持安全密碼輸入,此方法有助於以兩種方式保護密碼輸入,首先,它抑制回顯,所以密碼在用戶屏幕上不可見,其次,readPassword
返回一個字符數組,而不是String
,所以密碼能夠被覆蓋,一旦再也不須要就將其從內存中刪除。安全
Password示例是用於更改用戶密碼的原型程序,它演示了幾種Console
方法。oracle
import java.io.Console; import java.util.Arrays; import java.io.IOException; public class Password { public static void main (String args[]) throws IOException { Console c = System.console(); if (c == null) { System.err.println("No console."); System.exit(1); } String login = c.readLine("Enter your login: "); char [] oldPassword = c.readPassword("Enter your old password: "); if (verify(login, oldPassword)) { boolean noMatch; do { char [] newPassword1 = c.readPassword("Enter your new password: "); char [] newPassword2 = c.readPassword("Enter new password again: "); noMatch = ! Arrays.equals(newPassword1, newPassword2); if (noMatch) { c.format("Passwords don't match. Try again.%n"); } else { change(login, newPassword1); c.format("Password for %s changed.%n", login); } Arrays.fill(newPassword1, ' '); Arrays.fill(newPassword2, ' '); } while (noMatch); } Arrays.fill(oldPassword, ' '); } // Dummy change method. static boolean verify(String login, char[] password) { // This method always returns // true in this example. // Modify this method to verify // password according to your rules. return true; } // Dummy change method. static void change(String login, char[] password) { // Modify this method to change // password according to your rules. } }
Password
類遵循如下步驟:this
Console
對象,若是對象不可用,則停止。Console.readLine
以提示並讀取用戶的登陸名。Console.readPassword
以提示並讀取用戶的現有密碼。verify
以確認用戶有權更改密碼(在此示例中,verify
是一個始終返回true
的虛方法)。重複如下步驟,直到用戶輸入兩次相同的密碼:
Console.readPassword
兩次以提示並讀取新密碼。change
以進行更改(一樣,change
是一種虛擬方法)。