方法1:Scanner類
Java 5添加了java.util.Scanner類,這是一個用於掃描輸入文本的新的實用程序。它是以前的StringTokenizer和Matcher類之間的某種結合。由於任何數據都必須通過同一模式的捕獲組檢索或通過使用一個索引來檢索文本的各個部分。於是可以結合使用正則表達式和從輸入流中檢索特定類型數據項的方法。這樣,除了能使用正則表達式之外,Scanner類還可以任意地對字符串和基本類型(如int和double)的數據進行分析。藉助於Scanner,可以針對任何要處理的文本內容編寫自定義的語法分析器。
類加載
import java.util.Scanner;
用給定的輸入流創建一個Scanner對象:
Scanner in = new Scanner(InputStream in);
Scanner類的構造器
可以從字符串(Readable)、輸入流、文件等等來直接構建Scanner對象,有了Scanner了,就可以逐段(根據正則分隔式)來掃描整個文本,並對掃描後的結果做想要的處理。
Scanner類中的方法
Scanner in = new Scanner(System.in);
//檢測輸入中是否還有其他單詞
boolean bn = in.hasNext();
boolean bnl = in.hasNextLine();
boolean bni = in.hasNextInt();
boolean bnd = in.hasNextDouble();
//輸入一行(包含空格)
String str = in.nextLine();
//讀取一個單詞(以空白符作爲分隔符),只讀空格之前的數據,並且cursor指向本行
//從遇見的第一個有效字符(非空格,非換行符)開始掃描,
//當遇見第一個分隔符或結束符(空格或換行符)時,結束掃描,獲取掃描到的內容,即獲得第一個掃描到的不含空格、換行符的單個字符串。
String firstName = in.next();
//讀取一個整數,只讀取數值,剩下”\n”還沒有讀取,並將cursor放在本行中
int age = in.nextInt();
//讀取一個浮點數
double num = in.nextDouble()
上述方法執行時都會造成堵塞,等待用戶在命令行輸入回車確認
Scanner類讀取控制檯輸入
public static void main(String[] args) {
String s1,s2; Scanner sc=new Scanner(System.in);
System.out.print("請輸入第一個字符串:");
s1=sc.nextLine();
System.out.print("請輸入第二個字符串:");
s2=sc.next();
System.out.println("輸入的字符串是:"+s1+" "+s2);
sc.close();
}
運行結果:
請輸入第一個字符串:home
請輸入第二個字符串:work
輸入的字符串是:home work
把上面的程序修改一下:
s1=sc.next();
s2=sc.nextLine();
運行結果:
請輸入第一個字符串:home
請輸入第二個字符串:輸入的字符串是:home
解釋:nextLine()自動讀取了被next()去掉的Enter作爲他的結束符,所以沒辦法給s2從鍵盤輸入值。
Scanner類結束輸入的方法:在控制檯下輸入ctrl+Z
Scanner類輸入是可見的,不適合從控制檯讀取密碼,Java 6引入Console實現讀取
Scanner類讀取文件
將文件中的內容一行一行的讀入
*文檔在項目中(如圖)
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TestScannerRead {
public static void main(String[] args){
Scanner sc;
try {
//讀取項目中的文檔
sc = new Scanner(new File("ScannerTest.txt"));
//通過判斷是否有下一行來輸出文檔內容
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
* 文檔在本地
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TestScannerRead {
public static void main(String[] args){
FileInputStream fis;
try {
//利用文件上傳功能
fis = new FileInputStream("D:\\happy.txt");
//設置文件編碼
Scanner sc = new Scanner(fis,"UTF-8");
//輸出文件內容
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
方法2:Console類中的方法
類加載
import java.io.Console;
如果有可能進行交互操作,就通過控制檯窗口爲交互的用戶返回一個Console對象。否則返回null。對於任何一個通過控制檯窗口啓動的程序,都可以使用Console對象。否則,其可用性將與使用的系統有關。
*注:java.io.Console 只能用在標準輸入、輸出流未被重定向的原始控制檯中使用,在 Eclipse 或者其他 IDE 的控制檯是用不了的。
Console cons = System.console()
static char[] readPassword(String prompt,Object…args)
static String readLine(String prompt,Object…args)
爲了安全起見,返回的密碼存放在一維字符數組中,而不是字符串中。在對密碼進行處理之後,應馬上用一個填充值覆蓋數組元素。
採用console輸入一次只能讀取一行。
編譯:
javac TestConsole.java
java TestConsole
Console console=System.console();
if(console!=null)
{
System.out.println("input data");
String data=console.readLine();
System.out.println("data="+data);
char[] pwds=console.readPassword();
System.out.println("pwds="+pwds);
data=console.readLine("hello %s", "test");
System.out.println(data);
pwds=console.readPassword("hello password %s", "test");
System.out.println(pwds);
//輸出
console.writer().println("finish");
console.flush();
}else{
System.out.println("console==null");
}
方法3:System.in類
類加載
import java.io.*;
從輸入流中讀取一個字節(所輸入字符的ASCII碼),然後再將ASCII碼轉換爲Unicode碼,返回值爲Unicode編碼的int整型值。按回車輸入結束。
*缺點一: 該方法能獲取從鍵盤輸入的字符,但只能針對一個字符的獲取
*缺點二: 獲取的只是char類型的。如果想獲得int,float等類型的輸入,比較麻煩。
import java.io.IOException;
public class Test {
public static void main(String[] args) {
try{
System.out.print("Enter a Char:");
char i = (char)System.in.read();
System.out.println("Yout Enter Char is:" + i);
}
catch(IOException e){
e.printStackTrace();
}
}
}
方法4:InputStreamReader和BufferedReader方法
類加載
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
System.in是一個很原始、很簡陋的輸入流對象,通常不直接使用它來讀取用戶的輸入。一般會在外面封裝過濾流:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然後調用br.readLine()方法進行讀取。
*優點: 可以獲取鍵盤輸入的字符串
*缺點: 如何要獲取的是int,float等類型的仍然需要轉換
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Test {
public static void main(String[] args) {
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
try{
String name = br.readLine();
System.out.println("ReadTest Output:" + name);
}
catch(IOException e){
e.printStackTrace();
}
}
}