翻譯自Java Documentation Command line
程序有時需要在命令行環境下運行並且和用戶交互。JAVA以兩種方式支持這種交互操作: 通過標準流和通過控製台。
標準流是很多OS的一項功能。默認情況下,OS從鍵盤輸入,輸出到顯示器上。OS也支持文件IO和程序間IO,但是這些功能被命令行解釋器控製,而不是程序。
JAVA支持3中標準流:通過 System.in
使用標準輸入, 通過 System.out
使用標準輸出,和通過 System.err
使用標準錯誤。
你可能期望標準流是字符流,但是,出於曆史原因,它們都是字節流。 System.out
和 System.err
都被定義為 PrintStream
對象。盡管它是一個字節流,PrintStream利用一個內部字符流對象模仿了很多字符流的功能。
相比之下, System.in
是一個沒有字符流功能的字節流,為了把標準輸入作為一個字符流,使用InputStreamReader包裝System.in。
InputStreamReader cin = new InputStreamReader(System.in);
標準流的更高級的替代品是Console。這是一個預先定義的控製台對象,它具有標準流和其他類型的特性。控製台對於密碼項特別有用。Console對象通過他的reader和writer方法也提供了真正的字符IO流。
在開始使用Console前,必須先調用 System.console()
,如果Console可用,則會返回它;否則會返回null,可能是操作係統不允許或者是OS不支持或者程序在非交互環境下下啟動(譯者注: 無法在IDE中使用Console).
Console通過它的readPassword方法支持安全輸入密碼。這個方法通過兩種方麵支持安全輸入。首先,不顯示密碼;第二, readPassword
返回一個字符數組而不是一個String,因此隻要密碼不在需要,程序能從內存中將密碼清除。
下麵的例子是一個改變用戶密碼的原型,它演示了一些Console的方法。
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.
}
}
這個例子完成以下幾步:
嚐試獲取Console對象,如果對象不可用,退出;
調用Console.readLine提示輸入並讀取用戶的登錄名;
調用Console.readPassword提示輸入並讀取用戶已存在的名字;
調用verify,驗證密碼(例子中未實現該方法);
重複以上步驟,直到用戶輸入了兩次相同的密碼:
調用Console.readPassword兩次提示輸入並讀取一個新的密碼;
如果用戶兩次輸入相同的密碼,調用改變密碼;
用空格覆蓋老的密碼
本文來源:http://mp.weixin.qq.com/s?src=11×tamp=1529819942&ver=957&signature=f*wGbxtAzc9r8MAz-U5Vboc5otQmUnlK9bqJIbYHjNAsQqo-YQ06SZ6bXK6LWIA98TTRLgRGO2OFlKUUQB5IiPZCmG55kQoRPn14rVB*pvnJHt4nU*I2RIstesu3ommJ&new=1
Copyright © -Hilarious-Delicacy Moment- All Rights Reserved.