標準輸入 Scanner
介紹使用Scanner物件做標準輸入
我們設計程式時常常會需要夠造一個可以跟使用者互動的感覺,希望某個變數的值可以由使用者從鍵盤輸入,而一般電腦系統預設的標準輸入就是鍵盤(keyboard)。
Scanner
Scanner 是一個簡單的文字讀取器,可以解析字串成各個基本資料型態。
這個Scanner類別被放在 java.util套件中,別忘了事先import:
Scanner 是個類別,類別需要被初始化(實體化)成物件才能使用,所以我們先來看看Java內建的Scanner有哪些建構子:
Scanner Constructor(.) | |
Scanner(File source) | |
Scanner(File source, String charsetName) | |
Scanner(InputStream source) | |
Scanner(InputStream source, String charsetName) | |
Scanner(Path source) | |
Scanner(Path source, String charsetName) | |
Scanner(Readable source) | |
Scanner(ReadableByteChannel source) | |
Scanner(ReadableByteChannel source, String charsetName) | |
Scanner(String source) |
好,有一堆建構子可以用,但我們需要的是可以讀標準輸入流的Scanner,所以選擇Scanner(InputStream)。
那Java要怎麼取得這個標準輸入流呢? 就是System物件裡面的靜態欄位in。 順便來看一下System有哪些欄位:
修飾子、型態 | 欄位 | 描述 | |
static PrintStream | err | The "standard" error output stream. | |
static InputStream | in | The "standard" input stream. | |
static PrintStream | out | The "standard" output stream. |
好,現在我知道要在Java取得標準輸入流(standard input stream),就是System.in這個東東,那就用他來初始化我們的Scanner物件吧。
現在我們有一個Scanner物件,取名為s,他可以幫我們從標準輸入流拿資料進來。
怎麼使用? how to use?
Scanner 可以把一整行(line)的字串切成很多的token,預設是以空白(或tab)為基礎隔開,在透過各種next的方法,解析並轉換成我們需要的資料型態,然後回傳。
這裡所謂的token,硬要翻譯應該是『切割單元』。
舉個例:
"My name is yubin." 這個字串對於Scanner來說,預設(空白分隔)會分成4個token,
分別是:"My"、"name"、"is"、"yubin.",這就是token的概念。
來看一下Scanner提供的各種next方法:
回傳型態 | 方法 | 描述 | |
String | next() | 找下一個token並回傳。 | |
BigDecimal | nextBigDecimal() | 找下一個token並轉換成 BigDecimal 回傳。 | |
BigInteger | nextBigInteger() | 找下一個token並轉換成 BigInteger 回傳。 | |
boolean | nextBoolean() | 找下一個token並轉換成 boolean 回傳。 | |
byte | nextByte() | 找下一個token並轉換成 byte 回傳。 | |
double | nextDouble() | 找下一個token並轉換成 double 回傳。 | |
float | nextFloat() | 找下一個token並轉換成 float 回傳。 | |
int | nextInt() | 找下一個token並轉換成 int 回傳。 | |
long | nextLong() | 找下一個token並轉換成 long 回傳。 | |
short | nextShort() | 找下一個token並轉換成 short 回傳。 | |
String | nextLine() | 讀一整行的字串回傳。(包含空白,讀到換行為止) |
這些是比較常用的next方法,基本上可以滿足大部份的需求,要進一步了解還是要養成看doucment的習慣,沒事多翻翻增加熟練度。
範例程式:
執行結果:
利用Scanner物件接到標準輸入流就可以營造出互動的感覺。 (應該有吧XD)
示意圖(從左到右):
讀到結束
很多時候我們會希望程式可以一直讀,讀到檔案結束或輸入結束,Scanner當然也可以透過方法做到。
hasNext()系列方法,回傳boolean,表示接下來還有沒有東西:
回傳值 | 方法 | 描述 | |
boolean | hasNext() | 如果還有token可以讀回傳true。 | |
boolean | hasNextBigDecimal() | 如果下個token可以被解析成 BigDecimal 回傳true。 | |
boolean | hasNextBigInteger() | 如果下個token可以被解析成 BigInteger 回傳true。 | |
boolean | hasNextBoolean() | 如果下個token可以被解析成 boolean 回傳true。 | |
boolean | hasNextByte() | 如果下個token可以被解析成 byte 回傳true。 | |
boolean | hasNextDouble() | 如果下個token可以被解析成 double 回傳true。 | |
boolean | hasNextFloat() | 如果下個token可以被解析成 float 回傳true。 | |
boolean | hasNextInt() | 如果下個token可以被解析成 int 回傳true。 | |
boolean | hasNextLong() | 如果下個token可以被解析成 long 回傳true。 | |
boolean | hasNextShort() | 如果下個token可以被解析成 short 回傳true。 | |
boolean | hasNextLine() | 如果還有下一行回傳true。 |
依需求,使用這一系列的方法就可以做到輸入到結束為止。
大概像這樣:
Last updated