1. 程式人生 > >JAVA從控制檯讀資料的幾種方法

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而從控制檯中讀取資料。

<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>
在新增一個Scanner物件時需要一個System.in物件,因為實際上還是System.in在取得使用者輸入。Scanner的next()方法用以取得使用者輸入的字串;nextInt()將取得的輸入字串轉換為整數型別;同樣,nextFloat()轉換成浮點型;nextBoolean()轉換成布林型。

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也有一些缺點,根據ConsoleAPI 文件的說明:

虛擬機器是否具有控制檯取決於底層平臺,還取決於呼叫虛擬機器的方式。如果虛擬機器從一個互動式命令列開始啟動,且沒有重定向標準輸入和輸出流,那麼其控制檯將存在,並且通常連線到鍵盤並從虛擬機器啟動的地方顯示。如果虛擬機器是自動啟動的(例如,由後臺作業排程程式啟動),那麼它通常沒有控制檯。

通過上面的文件說明可以看出,在使用 IDE 的情況下,是無法獲取到Console例項的,原因在於在 IDE 的環境下,重新定向了標準輸入和輸出流,也是就是將系統控制檯上的輸入輸出重定向到了 IDE 的控制檯中。因此,在 IDE 中不能使用這個程式,而Test1Test3就沒有這種限制。

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>