您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Java中BufferedReader與Scanner讀入的區別是怎么樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
java.util.Scanner
類是一個簡單的文本掃描類,它可以解析基本數據類型和字符串。它本質上是使用正則表達式去讀取不同的數據類型。
Java.io.BufferedReader
類為了能夠高效的讀取字符序列,從字符輸入流和字符緩沖區讀取文本。
在Java中,我們都知道Java的標準輸入串是System.in。但是我們卻很少在Java中看到誰使用它,這是因為我們平時輸入的都是一個字符串或者是一個數字等等。而System.in提供的read方法是通過字節來讀取數據的,所以對我們來說不方便處理!
在Java SE6提供了一個非常方便的輸入數據的類Scanner,位于java.util包中,這個Scanner的具體用法為Scanner in = new Scanner(System.in)。
通過new創建一個Scanner對象,Scanner需要傳入一個System.in作為參數,這個我們可以看作是Scanner通過其內部機制將System.in包裝起來而實現數據的讀取工作的。
Scanner對象通過一系列的in.nextXxx();方法來讀取相應的基本類型的數據,通過in.hasNextXxx();方法來判斷是否還有下一個數據。
然而,Scanner讀取數據是按空格符(這其中包括空格鍵,Tab鍵,Enter鍵)來分割數據的。
只要遇到其中之一,Scanner的方法就會返回下一個輸入(當然nextLine()方法的結束符為換行符,它會返回換行符之前的數據),這也就是我們會面臨的另一個問題,當我們的輸入數據中有空格時,我們就不會得到我們想要的數據,這樣我們就要考慮到BufferReader來讀取數據!
BufferReader位于java.io包中,使用BufferReader就相對來說沒有那么多方法來讓你選擇!讀取數據比較固定,這樣格式也就相對來說比較單一,只要記住就這一讀取數據的方法。
BufferedReader br = new BufferedReader (newInputStreamReader(System.in));
這個BufferReader對象通過readLine();方法來讀取數據,readLine()是按Enter回車來讀取一行數據的,只要在回車鍵之前的都會被readLine()方法返回。
readLine()方法返回的是字符串,因此要使用BufferReader輸入一些字符之外的類型的數據,就要相對比較麻煩,需要通過一些XXXX.parseXxx();來轉換相應的數據類型,(例如:int類型的用Integer.parseInt(需要轉換的字符串))。
雖然麻煩一些,但通過BufferReader讀入的效率要比Scanner高一倍,這個差距可想而知,而且讀取的數據越多,效果就越明顯。
需要注意的是使用BufferedReader對象的readLine()方法必須處理java.io.IOException異常。
1、Scanner提供了一系列nextXxx()方法,當我們確定輸入的數據類型時,使用Scanner更加方便。也正是因為這個BufferedReader相對于Scanner來說要快一點,因為Scanner對輸入數據進行類解析,而BufferedReader只是簡單地讀取字符序列。
2、Scanner和BufferedReader都設置了緩沖區,Scanner有很少的緩沖區(1KB字符緩沖)相對于BufferedReader(8KB字節緩沖),但是這是綽綽有余的。
3、BufferedReader是支持同步的,而Scanner不支持。如果我們處理多線程程序,BufferedReader應當使用。
4、Scanner輸入的一個問題:在Scanner類中如果我們在任何7個nextXXX()方法之后調用nextLine()方法,這nextLine()方法不能夠從控制臺讀取任何內容,并且,這游標不會進入控制臺,它將跳過這一步。nextXXX()方法包括nextInt(),nextFloat(), nextByte(),nextShort(),nextDouble(),nextLong(),next()。
在BufferReader類中就沒有那種問題。這種問題僅僅出現在Scanner類中,由于nextXXX()方法忽略換行符,但是nextLine()并不忽略它。如果我們在nextXXX()方法和nextLine()方法之間使用超過一個以上的nextLine()方法,這個問題將不會出現了;因為nextLine()把換行符消耗了。
package com.zxt.base; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public classSystemInTest { private static Scanner sc; public static void main(String[] args) { // 使用Scanner輸入 sc = new Scanner(System.in); int num1 = sc.nextInt(); int num2 = sc.nextInt(); System.out.println("num1 + num2 = "+ (num1+ num2)); // 使用BufferReader輸入 InputStreamReaderisr = newInputStreamReader(System.in); BufferedReaderbr = new BufferedReader(isr); try { int num3 = Integer.parseInt(br.readLine()); int num4 = Integer.parseInt(br.readLine()); System.out.println("num3 + num4 = "+ (num3+ num4)); }catch(NumberFormatException | IOException e) { e.printStackTrace(); } // 使用Scanner輸入會遇到的問題 System.out.println(); System.out.print("Enter an Integer:"); int intValue = sc.nextInt(); System.out.print("Enter a String:"); StringstrValue = sc.nextLine(); System.out.printf("You have entered intValue is " + intValue+ " and strValue is " + strValue); // 問題原因:由于nextXXX()方法忽略換行符,但是nextLine()并不忽略它。所以如果我們在nextXXX()方法后面使用nextLine()將會出現問題 // 解決方案是:在使用nextXXX()方法后,在使用nextLine()讀取下一行數據前,多使用一個nextLine()用來消耗換行符 // int intValue = sc.nextInt(); // sc.nextLine(); // String strValue = sc.nextLine(); // 或者使用BufferReader不會出現該問題 System.out.println(); try { System.out.print("Enter an Integer:"); int intValue1 = Integer.parseInt(br.readLine()); System.out.print("Enter a String:"); StringstrValue1 = br.readLine(); System.out.printf("You have entered intValue1 is " + intValue1+ " and strValue1 is " + strValue1); }catch(NumberFormatException | IOException e) { e.printStackTrace(); } } }
看完上述內容,你們對Java中BufferedReader與Scanner讀入的區別是怎么樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。