java.util.Scanner類是一個簡單的文本掃描類,它可以解析基本數據類型和字符串。它本質上是使用正則表達式去讀取不同的數據類型。
Java.io.BufferedReader類為了能夠高效的讀取字符序列,從字符輸入流和字符緩沖區讀取文本。
下面是兩個類的不同之處:
當nextLine()被用在nextXXX()之後,用Scanner類有什麼問題
嘗試去猜測下面代碼的輸出內容;
// Code using Scanner Class import java.util.Scanner; class Differ { public static void main(String args[]) { Scanner scn = new Scanner(System.in); System.out.println("Enter an integer"); int a = scn.nextInt(); System.out.println("Enter a String"); String b = scn.nextLine(); System.out.printf("You have entered:- " + a + " " + "and name as " + b); } }
Input:
50 Geek
Output:
Enter an integer Enter a String You have entered:- 50 and name as
讓我們嘗試使用BufferReader類,並且使用相同的輸入
// Code using BufferedReader Class import java.io.*; class Differ { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter an integer"); int a = Integer.parseInt(br.readLine()); System.out.println("Enter a String"); String b = br.readLine(); System.out.printf("You have entered:- " + a + " and name as " + b); } }
Input:
50 Geek
Output:
Enter an integer Enter a String you have entered:- 50 and name as Geek
在Scanner類中如果我們在這任何7個nextXXX()方法之後調用nextLine()方法,這nextLine()方法不能夠從控制台讀取任何內容,並且,這游標不會進入控制台,它將跳過這一步。這nextXXX()方法是這些方法,nextInt(),nextFloat(), nextByte(), nextShort(), nextDouble(), nextLong(), next()。
在BufferReader類中就沒有那種問題。這種問題僅僅出現在Scanner類中,由於nextXXX()方法忽略***換行符***,但是,nextLine()並不忽略它。如果我們在nextXXX()方法和nextLine()方法之間使用超過一個以上的nextLine()方法,這個問題將不會出現了;因為nextLine()把換行符消耗了。可以參考這個程序的正確寫法(http://code.geeksforgeeks.org/CErAhD)。這個問題和C/C++(http://www.geeksforgeeks.org/problem-with-scanf-when-there-is-fgetsgetsscanf-after-it/)中的scanf()方法緊跟gets()方法的問題一樣。
其他的不同點:
原文鏈接:Difference between Scanner and BufferReader Class in Java(http://www.geeksforgeeks.org/difference-between-scanner-and-bufferreader-class-in-java/)
翻譯:crane-yuan
[ 轉載請保留原文出處、譯者和譯文鏈接。]