JAVA從控制檯讀資料的幾種方法
1. 使用標準輸入流:system.in
(JDK 1.4 及以下版本唯一的讀取方法)
System.in.read()一次只讀入一個位元組資料,返回一個整數,且必須初始化
其他型別資料需要手工轉換
讀取過程必須捕獲IOException
//int read = 0; char read = '0'; System.out.println("輸入資料:"); try { //read = System.in.read(); read = (char) System.in.read(); }catch(Exception e){ e.printStackTrace(); } System.out.println("輸入資料:"+read);
使用InputStreamReader獲取標準輸入流,再用字元流BufferedReader包裝InputStreamReader
這種方法可以讀取含空格/tab的字串。
<span style="font-size:14px;">import java.io.IOException; import java.io.InputStreamReader; public class Test1 { public static void main(String[] args) { String str = readString("請輸入字串:"); System.out.println("readString 方法的輸入:" + str); } /** * 使用系統的輸入流,從控制檯中讀取資料<br/> * 用於所用的JDK版本 * @param prompt 提示資訊 * @return 輸入的字串 */ private static String readString(String prompt) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = null; try { System.out.print(prompt); str = br.readLine(); } catch (IOException e) { e.printStackTrace(); } return str; } }</span>
2. 使用Scanner類(JDK 5.0 讀取的方法)
從 JDK 5.0 開始,基本類庫中增加了java.util.Scanner
類,根據它的 API 文件說明,這個類是採用正則表示式進行基本型別和字串分析的文字掃描器。使用它的Scanner(InputStream source)
構造方法,可以傳入系統的輸入流System.in
而從控制檯中讀取資料。
在新增一個Scanner物件時需要一個System.in物件,因為實際上還是System.in在取得使用者輸入。Scanner的next()方法用以取得使用者輸入的字串;nextInt()將取得的輸入字串轉換為整數型別;同樣,nextFloat()轉換成浮點型;nextBoolean()轉換成布林型。<span style="font-size:14px;">import java.util.Scanner; public class Test3 { public static void main(String[] args) { String str = readString5("請輸入字串:"); System.out.println("readString5 方法的輸入:" + str); } /** * 使用掃描器類(Scanner)從控制檯中讀取字串<br/> * 適用於JDK 5.0及以後的版本 * @param prompt 提示資訊 * @return 輸入的字串 */ private static String readString5(String prompt) { Scanner scanner = new Scanner(System.in); System.out.print(prompt); return <span style="color:#FF0000;">scanner.nextLine</span>(); } } </span>
3.java.io.Console
類(JDK 6.0 )
從 JDK 6.0 開始,基本類庫中增加了java.io.Console
類,獲得與當前 Java 虛擬機器關聯的基於字元的控制檯裝置。
<span style="font-size:14px;">import java.io.Console;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
String str = readString6("請輸入字串:");
System.out.println("readString6 方法的輸入:" + str);
}
/**
* 使用控制檯類(Console)從控制檯中讀取字串<br/>
* 適用於JDK 1.6或以後的版本
* @param prompt 提示資訊
* @return 輸入的字串
*/
private static String readString6(String prompt) {
Console console = System.console();
if (console == null) {
throw new <span style="color:#FF0000;">IllegalStateException</span>("不能使用控制檯");
}
return <span style="color:#FF0000;">console.readLine</span>(prompt);
}
}</span>
使用Console類的readPassword()方法可以在控制檯上不回顯地輸入密碼,並將密碼結果儲存在
char
陣列中,根據 API 文件的建議,在使用後應立即將陣列清空,以減少其在記憶體中佔用的時間,以便增強安全性。
但是,Console
也有一些缺點,根據Console
API 文件的說明:
虛擬機器是否具有控制檯取決於底層平臺,還取決於呼叫虛擬機器的方式。如果虛擬機器從一個互動式命令列開始啟動,且沒有重定向標準輸入和輸出流,那麼其控制檯將存在,並且通常連線到鍵盤並從虛擬機器啟動的地方顯示。如果虛擬機器是自動啟動的(例如,由後臺作業排程程式啟動),那麼它通常沒有控制檯。
通過上面的文件說明可以看出,在使用 IDE 的情況下,是無法獲取到Console
例項的,原因在於在 IDE 的環境下,重新定向了標準輸入和輸出流,也是就是將系統控制檯上的輸入輸出重定向到了 IDE 的控制檯中。因此,在 IDE 中不能使用這個程式,而Test1
和Test3
就沒有這種限制。
4.
還有一種非控制檯讀入資料的辦法,就是採用 Swing 中的JOptionPane,會彈出一個非常漂亮的輸入對話方塊讓使用者輸入資料,但這是一種比較另類的做法,不推薦使用。
<span style="font-size:14px;">import javax.swing.JOptionPane;
public class Test2 {
public static void main(String[] args) {
String str = readStringFromDialog("請輸入字串:");
System.out.println("readStringFromDialog 方法的輸入:" + str);
}
/**
* 使用JOptionPane的輸入對話方塊,輸入字串<br/>
* 用於所用的JDK版本
* @param prompt 提示資訊
* @return 輸入的字串
*/
private static String readStringFromDialog(String prompt) {
return JOptionPane.showInputDialog(prompt);
}
}</span>