命令行I/O
程序通常從命令行運(yùn)行,并在命令行環(huán)境中與用戶交互,Java平臺以兩種方式支持這種交互:通過標(biāo)準(zhǔn)流和控制臺。
標(biāo)準(zhǔn)流標(biāo)準(zhǔn)流是許多操作系統(tǒng)的一個特性,默認(rèn)情況下,它們從鍵盤讀取輸入并將輸出寫入顯示器,它們還支持文件和程序之間的I/O,但該功能由命令行解釋器控制,而不是程序。
Java平臺支持三種標(biāo)準(zhǔn)流:標(biāo)準(zhǔn)輸入,可通過System.in訪問;標(biāo)準(zhǔn)輸出,可通過System.out訪問;和標(biāo)準(zhǔn)錯誤,通過System.err訪問。這些對象是自動定義的,不需要打開,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤均用于輸出,多帶帶具有錯誤輸出允許用戶將常規(guī)輸出轉(zhuǎn)移到文件并仍然能夠讀取錯誤消息,有關(guān)更多信息,請參閱命令行解釋程序的文檔。
你可能希望標(biāo)準(zhǔn)流是字符流,但由于歷史原因,它們是字節(jié)流,System.out和System.err定義為PrintStream對象,雖然從技術(shù)上講它是字節(jié)流,但PrintStream利用內(nèi)部字符流對象來模擬字符流的許多功能。
相比之下,System.in是一個沒有字符流功能的字節(jié)流,要將標(biāo)準(zhǔn)輸入用作字符流,請?jiān)?b>InputStreamReader中包裝System.in。
InputStreamReader cin = new InputStreamReader(System.in);控制臺
控制臺是標(biāo)準(zhǔn)流的更高級替代方案,這是一個類型為Console的多帶帶、預(yù)定義的對象,它具有標(biāo)準(zhǔn)流提供的大部分功能,以及其他功能。控制臺對于安全密碼輸入特別有用,Console對象還通過其reader和writer方法提供真正的字符流的輸入和輸出流。
在程序可以使用控制臺之前,它必須通過調(diào)用System.console()來嘗試檢索Console對象,如果Console對象可用,則此方法將返回該對象,如果System.console返回NULL,則不允許使用Console操作,因?yàn)椴僮飨到y(tǒng)不支持它們,或者因?yàn)槌绦蚴窃诜墙换ナ江h(huán)境中啟動的。
Console對象通過其readPassword方法支持安全密碼輸入,此方法有助于以兩種方式保護(hù)密碼輸入,首先,它抑制回顯,因此密碼在用戶屏幕上不可見,其次,readPassword返回一個字符數(shù)組,而不是String,因此密碼可以被覆蓋,一旦不再需要就將其從內(nèi)存中刪除。
Password示例是用于更改用戶密碼的原型程序,它演示了幾種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. } }
Password類遵循以下步驟:
嘗試檢索Console對象,如果對象不可用,則中止。
調(diào)用Console.readLine以提示并讀取用戶的登錄名。
調(diào)用Console.readPassword以提示并讀取用戶的現(xiàn)有密碼。
調(diào)用verify以確認(rèn)用戶有權(quán)更改密碼(在此示例中,verify是一個始終返回true的虛方法)。
重復(fù)以下步驟,直到用戶輸入兩次相同的密碼:
調(diào)用Console.readPassword兩次以提示并讀取新密碼。
如果用戶兩次都輸入相同的密碼,請調(diào)用change以進(jìn)行更改(同樣,change是一種虛擬方法)。
用空格覆蓋這兩個密碼。
用空格覆蓋舊密碼。
上一篇:格式化流 下一篇:數(shù)據(jù)流文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72962.html
系統(tǒng)實(shí)用工具 System類實(shí)現(xiàn)了許多系統(tǒng)實(shí)用程序,其中一些已在上一節(jié)配置實(shí)用程序中介紹過,本節(jié)介紹一些其他系統(tǒng)實(shí)用程序。 命令行I/O對象 系統(tǒng)提供了幾個預(yù)定義的I/O對象,這些對象在Java應(yīng)用程序中非常有用,可以從命令行啟動,它們實(shí)現(xiàn)了大多數(shù)操作系統(tǒng)提供的標(biāo)準(zhǔn)I/O流,以及用于輸入密碼的控制臺對象,有關(guān)更多信息,請參閱基礎(chǔ)I/O課程中的命令行I/O。 系統(tǒng)屬性 在屬性中,我們研究了應(yīng)用程序可...
字符流 Java平臺使用Unicode約定存儲字符值,字符流I/O自動將此內(nèi)部格式與本地字符集進(jìn)行轉(zhuǎn)換,在Western語言環(huán)境中,本地字符集通常是ASCII的8位超集。 對于大多數(shù)應(yīng)用程序,具有字符流的I/O并不比具有字節(jié)流的I/O復(fù)雜,使用流類完成的輸入和輸出會自動轉(zhuǎn)換為本地字符集和從本地字符集轉(zhuǎn)換,使用字符流代替字節(jié)流的程序會自動適應(yīng)本地字符集并為國際化做了準(zhǔn)備 — 所有這些都無需程序員的額...
配置實(shí)用工具 本節(jié)介紹一些幫助應(yīng)用程序訪問其啟動上下文的配置實(shí)用程序。 屬性 Properties是作為鍵/值對管理的配置值,在每對中,鍵和值都是字符串值,鍵標(biāo)識并用于檢索值,就像變量名用于檢索變量的值一樣。例如,能夠下載文件的應(yīng)用程序可能使用名為download.lastDirectory的屬性來跟蹤上次下載所使用的目錄。 要管理屬性,請創(chuàng)建java.util.Properties的實(shí)例,此類提...
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實(shí)踐沒有利用在后續(xù)版本中引入的改進(jìn)。 Java教程是希望使用Java編程語言創(chuàng)建應(yīng)用程序的程序員的實(shí)用指南,其中包括數(shù)百個完整的工作示例和數(shù)十個課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術(shù)和安裝Java開發(fā)軟件并使用...
數(shù)據(jù)流 數(shù)據(jù)流支持原始數(shù)據(jù)類型值(boolean、char、byte、short、int、long、float和double)以及String值的二進(jìn)制I/O,所有數(shù)據(jù)流都實(shí)現(xiàn)DataInput接口或DataOutput接口,本節(jié)重點(diǎn)介紹這些接口最廣泛使用的實(shí)現(xiàn),DataInputStream和DataOutputStream。 DataStreams示例通過寫出一組數(shù)據(jù)記錄,然后再次讀取它們來演...
閱讀 1289·2023-04-25 19:33
閱讀 1171·2021-10-21 09:39
閱讀 3644·2021-09-09 09:32
閱讀 2614·2019-08-30 10:58
閱讀 1599·2019-08-29 16:17
閱讀 873·2019-08-29 15:29
閱讀 2885·2019-08-26 11:55
閱讀 2657·2019-08-26 10:33