最新動態

翻譯(5)--命令行IO

發表日期:2018-06-24 14:59:15 作者: Angela 標籤: 分類:

翻譯自Java Documentation Command line

程序有時需要在命令行環境下運行並且和用戶交互。JAVA以兩種方式支持這種交互操作: 通過標準流和通過控製台。

標準流

標準流是很多OS的一項功能。默認情況下,OS從鍵盤輸入,輸出到顯示器上。OS也支持文件IO和程序間IO,但是這些功能被命令行解釋器控製,而不是程序。

JAVA支持3中標準流:通過 System.in使用標準輸入, 通過 System.out使用標準輸出,和通過 System.err使用標準錯誤。

你可能期望標準流是字符流,但是,出於曆史原因,它們都是字節流。 System.outSystem.err都被定義為 PrintStream對象。盡管它是一個字節流,PrintStream利用一個內部字符流對象模仿了很多字符流的功能。

相比之下, System.in是一個沒有字符流功能的字節流,為了把標準輸入作為一個字符流,使用InputStreamReader包裝System.in。

  1. InputStreamReader cin = new InputStreamReader(System.in);

控製台

標準流的更高級的替代品是Console。這是一個預先定義的控製台對象,它具有標準流和其他類型的特性。控製台對於密碼項特別有用。Console對象通過他的reader和writer方法也提供了真正的字符IO流。

在開始使用Console前,必須先調用 System.console(),如果Console可用,則會返回它;否則會返回null,可能是操作係統不允許或者是OS不支持或者程序在非交互環境下下啟動(譯者注: 無法在IDE中使用Console).

Console通過它的readPassword方法支持安全輸入密碼。這個方法通過兩種方麵支持安全輸入。首先,不顯示密碼;第二, readPassword返回一個字符數組而不是一個String,因此隻要密碼不在需要,程序能從內存中將密碼清除。

下麵的例子是一個改變用戶密碼的原型,它演示了一些Console的方法。

  1. import java.io.Console;

  2. import java.util.Arrays;

  3. import java.io.IOException;

  4. public class Password {

  5.    public static void main (String args[]) throws IOException {

  6.        Console c = System.console();

  7.        if (c == null) {

  8.            System.err.println("No console.");

  9.            System.exit(1);

  10.        }

  11.        String login = c.readLine("Enter your login: ");

  12.        char [] oldPassword = c.readPassword("Enter your old password: ");

  13.        if (verify(login, oldPassword)) {

  14.            boolean noMatch;

  15.            do {

  16.                char [] newPassword1 = c.readPassword("Enter your new password: ");

  17.                char [] newPassword2 = c.readPassword("Enter new password again: ");

  18.                noMatch = ! Arrays.equals(newPassword1, newPassword2);

  19.                if (noMatch) {

  20.                    c.format("Passwords don't match. Try again.%n");

  21.                } else {

  22.                    change(login, newPassword1);

  23.                    c.format("Password for %s changed.%n", login);

  24.                }

  25.                Arrays.fill(newPassword1, ' ');

  26.                Arrays.fill(newPassword2, ' ');

  27.            } while (noMatch);

  28.        }

  29.        Arrays.fill(oldPassword, ' ');

  30.    }

  31.    // Dummy change method.

  32.    static boolean verify(String login, char[] password) {

  33.        // This method always returns

  34.        // true in this example.

  35.        // Modify this method to verify

  36.        // password according to your rules.

  37.        return true;

  38.    }

  39.    // Dummy change method.

  40.    static void change(String login, char[] password) {

  41.        // Modify this method to change

  42.        // password according to your rules.

  43.    }

  44. }

這個例子完成以下幾步:

  1. 嚐試獲取Console對象,如果對象不可用,退出;

  2. 調用Console.readLine提示輸入並讀取用戶的登錄名;

  3. 調用Console.readPassword提示輸入並讀取用戶已存在的名字;

  4. 調用verify,驗證密碼(例子中未實現該方法);

  5. 重複以上步驟,直到用戶輸入了兩次相同的密碼:

  • 調用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.