BufferedReader和Scanner的用法和區別(建議多使用BufferedReader)

轉角處、守候發表於2020-11-28

在Java SE 6中,可以使用Scanner類取得使用者的輸入,Scanner類位於java.util包中,如果你要使用Scanner取得使用者輸入的話,要導包 import java.util.Scanner;。
這個Scanner的具體用法為Scanner in = new Scanner(System.in);。通過new建立一個Scanner物件,Scanner需要傳入一個System.in作為引數,這個我們可以看作是Scanner通過其內部機制將System.in包裝起來而實現資料的讀取工作的。
Scanner物件通過一系列的in.nextXxx();方法來讀取相應的基本型別的資料,通過in.hasNextXxx();方法來判斷是否還有下一個資料。
然而,Scanner讀取資料是按空格符,這其中包括空格鍵,Tab鍵,Enter鍵。只要遇到其中之一,Scanner的方法就會返回下一個輸入。
BufferedReader類位於java.io包中,所以要使用這個類,就要引入java.io這個包:import java.io.BufferedReader. 使用BufferedReader物件的readLine()方法必須處理java.io.IOException異常(Exception).
使用BufferedReader來取得輸入,理解起來要複雜得多.但是使用這個方法是固定的,每次使用前先如法炮製就可以了.

  BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
  String text = buffer.readLine();  

BufferReader物件通過readLine()方法來讀取資料,readLine()是按Enter回車來讀取一行資料的,只要在Enter鍵之前的的所有字元都會被readLine(),不包括最後按下的Enter返回字元。

一.BufferReader和Scanner的用法

1.BufferedReader的使用方法

 import java.io.*;
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));//建立BufferedReader物件,從鍵盤讀入
            BufferedReader br2= new BufferedReader(new FileReader("test.txt"));//建立BufferedReader物件,從文字檔案讀入        
			String str = br.readLine();  //讀取一行字串  
			int a = Integer.parseInt(str);  //將字元轉化為整型  
			System.out.println(a);  
            String[] temp=br1.readLine().split(" ");//讀取一行資料並用空格分隔,存入字串陣列
        }

BufferedReader類位於java.io包中,所以要使用這個類,就要引入java.io這個包
import java.io.BufferedReader.readLine()方法會返回使用者在按下Enter鍵之前的所有字元輸入,不包括最後按下的Enter返回字元.使用BufferedReader物件的readLine()方法必須處理java.io.IOException異常(Exception)。
BufferReader讀取的資料都以字串的形式儲存,如果需要其他形式的資料,需要進行強制轉換。

2.Scanner的使用方法

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
    	Scanner input = new Scanner(System.in);//建立Scanner類物件,從鍵盤讀入資料
    	String temp1 = input.nextLine();//讀取下一行資料
    	String temp2 = input.next();//讀取字元直到判斷輸入結束
    	input.useDelimiter(" ");//若以空格分隔字串,需要讀取空格才能繼續讀取或者使用一個空的sc.nextLine()跳過空格 PS:此方法可以設定其他分隔符
    	int temp3 = input.nextInt();//將讀取的字串轉換成int型別的整數
    	double temp4 = input.nextDouble();//將讀取的字串轉換成float型;
    	boolean temp5 = input.nextBoolean();//將讀取的字串轉換成boolean型; 
    }
}

需要注意的是Scanner中的next()和nextline()方法的區別:
1.nextLine()方法返回的是Enter鍵之前的所有字元,它是可以得到帶空格的字串的。
next()會自動消去有效字元前的空格,只返回輸入的字元,不能得到帶空格的字串。
2.next()在輸入有效字元之後,將其後輸入的空格鍵、Tab鍵或Enter鍵等視為分隔符或結束符。
nextLine()方法的結束符只是Enter鍵。

如果使用Scanner類讀取的資料中含有空格,不一定非要使用BufferedReader類,可以呼叫Scanner類裡的useDelimiter方法,設定它的分隔符。
Java中Scanner.useDelimiter( )方法使用

二.BufferedReader和Scanner的區別

1.輸入區別
用Scanner獲得使用者的輸入非常的方便,但是Scanner取得輸入的依據是空格符,包括空格鍵,Tab鍵和Enter鍵.當按下這其中的任一鍵時,Scanner就會返回下一個輸入. 當你輸入的內容中間包括空格時,顯然,使用Scanner就不能完整的獲得你輸入的字串.這時候我們可以考慮使用BufferedReader類取得輸入

2.效能比較
經過測試,Scanner的平均耗時是BufferedReader的10倍左右
java Scanner與BufferedReader讀取鍵盤輸入效能比較
在網上刷題的時候如果沒有特殊困難,強烈推薦使用BufferedReader讀取資料!

相關文章