Java™ 教程(命令行I/O)

命令行I/O

程序一般從命令行運行,並在命令行環境中與用戶交互,Java平臺以兩種方式支持這種交互:經過標準流和控制檯。html

標準流

標準流是許多操做系統的一個特性,默認狀況下,它們從鍵盤讀取輸入並將輸出寫入顯示器,它們還支持文件和程序之間的I/O,但該功能由命令行解釋器控制,而不是程序。java

Java平臺支持三種標準流:標準輸入,可經過System.in訪問;標準輸出,可經過System.out訪問;和標準錯誤,經過System.err訪問。這些對象是自動定義的,不須要打開,標準輸出和標準錯誤均用於輸出,單獨具備錯誤輸出容許用戶將常規輸出轉移到文件並仍然可以讀取錯誤消息,有關更多信息,請參閱命令行解釋程序的文檔。git

你可能但願標準流是字符流,但因爲歷史緣由,它們是字節流,System.outSystem.err定義爲PrintStream對象,雖然從技術上講它是字節流,但PrintStream利用內部字符流對象來模擬字符流的許多功能。github

相比之下,System.in是一個沒有字符流功能的字節流,要將標準輸入用做字符流,請在InputStreamReader中包裝System.insegmentfault

InputStreamReader cin = new InputStreamReader(System.in);

控制檯

控制檯是標準流的更高級替代方案,這是一個類型爲Console的單獨、預約義的對象,它具備標準流提供的大部分功能,以及其餘功能。控制檯對於安全密碼輸入特別有用,Console對象還經過其readerwriter方法提供真正的字符流的輸入和輸出流。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

  1. 嘗試檢索Console對象,若是對象不可用,則停止。
  2. 調用Console.readLine以提示並讀取用戶的登陸名。
  3. 調用Console.readPassword以提示並讀取用戶的現有密碼。
  4. 調用verify以確認用戶有權更改密碼(在此示例中,verify是一個始終返回true的虛方法)。
  5. 重複如下步驟,直到用戶輸入兩次相同的密碼:

    • 調用Console.readPassword兩次以提示並讀取新密碼。
    • 若是用戶兩次都輸入相同的密碼,請調用change以進行更改(一樣,change是一種虛擬方法)。
    • 用空格覆蓋這兩個密碼。
  6. 用空格覆蓋舊密碼。

上一篇:格式化流

下一篇:數據流

相關文章
相關標籤/搜索