逆光飛行的玉珮

导航

[Java] 資料輸入的差異性(System.in、BufferedReader、Scanner)

 

一、System.in

System.in提供的read方法每次只能讀取一個字節的數據,不實用

 

二、BufferedReader

BufferedReader類位於java.io包中,使用要加上 import java.io.BufferedReader。 

使用BufferedReader來取得輸入的方法是固定的,每次使用前先如法炮製就可以 

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

readLine()方法會返回用戶在按下Enter鍵之前的所有字符輸入,但不包括最後按下的Enter返回字符。

註:使用BufferedReader對象的readLine()方法必須處理 java.io.IOException異常(Exception) 

 

 

三、Scanner

在Java SE 6中,新增Scanner類,用以取得用戶的輸入,Scanner類位於java.util包中,需要加上import java.util.Scanner ,告訴編譯器你將使用j ava.util 包中的Scanner類。

創建Scanner類的對象時,需要用System.in作為它的參數,System.in取得用戶輸入的內容後,交給Scanner來作處理。

Scanner類中提供了多個方法:        

next():是以空白或換行為區格,取得一個字符串      

nextLine()則是以換行為區格讀取整行字符串

Scanner cin = new Scanner(System.in);     //輸入   1234 Enter(\n)
String str = cin.next();                  //抓取   1234            剩下\n
String str2 = cin.nextLine();             //抓取   \n

next()是抓取空白或\n換行字元以前的字串,所以next()抓完字串之後\n就被nextLine()抓住了

解決方法就是不斷讓nextLine()重複抓取,即可抓到完整字串 ( 含 \n ! )

Scanner cin = new Scanner(System.in);        //輸入   1234 Enter(\n)
String str = cin.next();                     //抓取   1234            剩下\n
while( (str2 = cin.nextLine()).equals("") ); //抓到\n,判斷為"",於是再跑一次,抓取1234 Enter(\n)

 

nextInt():將取得的字符串轉換成int類型的整數;        

nextFloat():將取得的字符串轉換成float型;        

nextBoolean():將取得的字符串轉換成boolean型; 

...等

用Scanner獲得用戶的輸入非常的方便,但是Scanner取得輸入 (nextLine()除外) 的主要依據是空格符 (包括空格鍵、Tab鍵和Enter鍵) 當按下這其中的任一鍵時,Scanner就會返回下一個輸入,所以當輸入的內容中間包括空格時,應該考慮使用BufferedReader取得完整的輸入。

 

 

文章最後來討論效能面

1. BufferedReader 是先把數據讀到緩存區,然後在寫到硬盤裡

2. Scanner是直接往硬盤寫數據

效率的比較 BufferedReader > Scanner

 

posted on 2019-01-23 18:34  逆光飛行的玉珮  阅读(243)  评论(0编辑  收藏  举报