BufferedReader和Scanner的區別

標題1:BufferedReader的用法

首先看看下面的代碼

import java.io.*;
public class Main {
   public static void main(String[] args) throws IOException {
      //創建BufferedReader對象,從鍵盤讀入
      BufferedReader b1=new BufferedReader(new InputStreamReader(System.in));
      //創建BufferedReader對象,從文本文件讀入
      BufferedReader b2= new BufferedReader(new FileReader("test.txt"));
      //讀取一行數據並用空格分隔,存入字符串數組
      String[] srt=b1.readLine().split(" ");
  }
}

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

使用BufferedReader讀入數據,需要new一個InputStreamReader類的對象(源碼顯示:)
在這裏插入圖x片描述

標題2:Scanner的用法

  • 在命令行模式下要輸入數據至程序中時,可以使用標準輸入串對象System.in。但是,我們並不經常直接使用它,因爲System.in提供的read()每次只能讀取一個字節的數據,而我們平時所應用的通常是讀取一個字符串或者是一個數字,所以read方法所以提供的功能,對我們來說並沒有太大的用處。
  • 在Java SE 6中,可以使用Scanner類取得用戶的輸入。Scanner類位於java.util包中,如果你要使用Scanner取得用戶輸入的話,要加上import java.util.Scanner; 這條語句。import的功能是告訴編譯器,我們將使用java.util包中的Scanne類。

Scanner的常用方法:

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);//創建Scanner類對象,從鍵盤讀入數據
        String t1=sc.nextLine();//讀取下一行數據
        String t2=sc.next();//讀取字符直到判斷輸入結束
        sc.useDelimiter(" ");//若以空格分隔字符串,需要讀取空格才能繼續讀取或者使用一個空的sc.nextLine()跳過空格
        int t3=sc.nextInt();//將讀取的字符串轉換成int類型的整數
        double t4=sc.nextDouble();//將讀取的字符串轉換成float型;
        boolean t5=sc.nextBoolean();//將讀取的字符串轉換成boolean型;
    }
}
  • 需要注意的是Scanner中的next()和nextLine()方法的區別
    1、nextLine()方法返回的是Enter鍵之前的所有字符,它是可以得到帶空格的字符串的。
    next()會自動消去有效字符前的空格,只返回輸入的字符,不能得到帶空格的字符串。
    2、nextLine()方法的結束符只是Enter鍵。
    next()在輸入有效字符之後,將其後輸入的空格鍵、Tab 鍵或Enter鍵等視爲分隔符或結束符。

  • Scanner的hasNext()方法:
    【查看源碼】:
    在這裏插入圖片描述
    【方法解釋】:hasNext()方法的執行過程是這樣的:當執行到hasNext()時,它會先掃描緩衝區中是否有字符,有則返回true,繼續掃描。直到掃描爲空,這時並不返回false,而是將方法阻塞,等待我們輸入內容然後繼續掃描。這樣的話,它會一直處於循環等待中。
    【解決方法】:使用帶有參數的重載方法,當掃描到的字符與參數值匹配時返回true。
    在這裏插入圖片描述

————————例如下面代碼————————
【修改代碼前】
在這裏插入圖片描述
【修改代碼後】
在這裏插入圖片描述

標題3:兩者的區別

  • 對於是否可以讀入空格符有區別
    Scanner取得輸入數據的依據是空格符,包括空格鍵,Tab鍵和Enter鍵,Scanner就會返回下一個輸入。所以說**Scanner不能輸入空格(除了它的nextLine方法可以讀取空格符,再其他的方法都不能讀取空格,but能不用就不用這個方法,在最後面做特殊解釋)**如果希望取得含有空格的字符串;

    BufferedReader可以做到,它的readLine()方法會返回用戶在按下Enter鍵之前的所有字符輸入(包含空格),不包括最後按下的Enter。

  • 並且兩者在效率方面也有很大的區別
    BufferedReader是從字符輸入流中讀取文本,緩衝各個字符,從而提供字符、數組和行的高效讀取!(
    BufferedReader是提前先把數據讀到緩存區,然後再寫到硬盤裏;Scanner是直接往硬盤寫數據)速度要比Scanner快!而且也可以設置緩衝區的大小,或者可使用默認的大小。大多數情況下,默認值就足夠大了。
    性能比較經過測試,Scanner的平均耗時是BufferedReader的10倍左右,在網上題刷,如果沒有特殊困難,強烈推薦使用BufferedReader讀取數據!

—————————————————————————————

這裏特殊解釋一下Scanner的nextLine()方法
【代碼演示】
在這裏插入圖片描述
【運行結果】:
在這裏插入圖片描述

  • 一般程序中,使用nextLine()方法可能會出現吞回車現象,(觀察上面兩個圖)
    ==>運行結果中,讓輸入第3個字符串,可是沒等輸入就已經運行結束了。

    這裏是因爲當輸入完第2個字符串world後按回車鍵,又next()是讀不到回車的,而是將回車作爲分隔符,所以,留給了第3個字符串的nextLine()。

    第3個字符串由nextLine()輸入,所以nextLine()方法就順勢直接讀取了回車鍵退出程序了。
    (當成第3個字符串是空字符串了)

  • 解決此現象:這裏爲了能正常輸入第三個字符串,需在 輸入第3個字符串之前多加一句nextLine(),去讀取第2個next()留下的回車

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章