1. 程式人生 > >java 中的Scanner

java 中的Scanner

沒有 創建 str style 輸出結果 keyword 技術 n) ada

java 中的Scanner(非常詳細不看後悔)

java.util.Scanner是Java5的新特征,主要功能是簡化文本掃描。這個類最實用的地方表現在獲取控制臺輸入,其他的功能都很雞肋,盡管Java API文檔中列舉了大量的API方法,但是都不怎麽地。

一、掃描控制臺輸入

這個例子是常常會用到,但是如果沒有Scanner,你寫寫就知道多難受了。
當通過new Scanner(System.in)創建一個Scanner,控制臺會一直等待輸入,直到敲回車鍵結束,把所輸入的內容傳給Scanner,作為掃描對象。如果要獲取輸入的內容,則只需要調用Scanner的nextLine()方法即可。

/**
* 掃描控制臺輸入
*
* @author leizhimin 2009-7-24 11:24:47
*/


public class TestScanner {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("請輸入字符串:");
while (true) {
String line = s.nextLine();
if (line.equals("exit"
)) break;
System.out.println(">>>" + line);
}
}
}


請輸入字符串:
234
>>>234
wer
>>>wer
bye
>>>bye
exit

Process finished with exit code 0



先寫這裏吧,有空再繼續完善。

二、如果說Scanner使用簡便,不如說Scanner的構造器支持多種方式,構建Scanner的對象很方便。

可以從字符串(Readable)、輸入流、文件等等來直接構建Scanner對象
,有了Scanner了,就可以逐段(根據正則分隔式)來掃描整個文本,並對掃描後的結果做想要的處理。


三、Scanner默認使用空格作為分割符來分隔文本,但允許你指定新的分隔符

使用默認的空格分隔符:
public static void main(String[] args) throws FileNotFoundException {
Scanner s = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf ......asdfkl las");
// s.useDelimiter(" |,|\\.");
while (s.hasNext()) {
System.out.println(s.next());
}
}



123
asdf
sd
45
789
sdf
asdfl,sdf.sdfl,asdf
......asdfkl
las

Process finished with exit code 0



將註釋行去掉,使用空格或逗號或點號作為分隔符,輸出結果如下:
123
asdf
sd
45
789
sdf
asdfl
sdf
sdfl
asdf







asdfkl

las

Process finished with exit code 0




四、一大堆API函數,實用的沒幾個

(很多API,註釋很讓人迷惑,幾乎毫無用處,這個類就這樣被糟蹋了,啟了很不錯的名字,實際上做的全是齷齪事)

下面這幾個相對實用:

delimiter()
返回此 Scanner 當前正在用於匹配分隔符的 Pattern。
hasNext()
判斷掃描器中當前掃描位置後是否還存在下一段。(原APIDoc的註釋很扯淡)
hasNextLine()
如果在此掃描器的輸入中存在另一行,則返回 true。
next()
查找並返回來自此掃描器的下一個完整標記。
nextLine()
此掃描器執行當前行,並返回跳過的輸入信息。



五、逐行掃描文件,並逐行輸出

看不到價值的掃描過程
public static void main(String[] args) throws FileNotFoundException {
InputStream in = new FileInputStream(new File("C:\\AutoSubmit.java"));
Scanner s = new Scanner(in);
while(s.hasNextLine()){
System.out.println(s.nextLine());
}
}



package own;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;

import com.verisign.uuid.UUID;

/**
* @author wangpeng
*
*/
public class AutoSubmit {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {

附:

Scanner類說明

使用Scanner類可以很方面地獲取用戶的鍵盤輸入,Scanner是一個基於正則表達式的文本掃描器,它可以從文件、輸入流、字符串中解析出基本類型值和字符串值。Scanner類提供了多個構造器,不同的構造器可接受文件、輸入流、字符串作為數據源,用於從文件、輸入流、字符串中解析數據。

Scanner類的常用方法

  • hasNextXXX():是否還有下一個輸入項,其中XXX可以是Int、Long等代表基本數據類型的字符串。如果需要判斷是否包含下一個字符串,則可以省略XXX。
  • nextXXX():獲取下一個輸入項。XXX的含義與前一個方法中XXX相同。

代碼示例1

Java代碼 技術分享
  1. <strong>import java.util.Scanner;
  2. public class ScannerKeyBoardTest {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. // System.in代表標準輸入,就是鍵盤輸入
  8. Scanner sc = new Scanner(System.in);
  9. // 增加下面一行將只把回車作為分隔符
  10. // sc.useDelimiter("\n");
  11. // 判斷是否還有下一個輸入項
  12. while(sc.hasNext())
  13. {
  14. // 輸出輸入項
  15. System.out.println("鍵盤輸入的內容是:"
  16. + sc.next());
  17. }
  18. }
  19. }</strong>

運行結果1

hello

鍵盤輸入的內容是:hello

welcome

鍵盤輸入的內容是:welcome

go

鍵盤輸入的內容是:go

運行結果2

當去掉sc.useDelimiter("\n");的註釋,運行結果如下:

line 1

鍵盤輸入的內容是:line 1

line 2

鍵盤輸入的內容是:line 2

line 3

鍵盤輸入的內容是:line 3

代碼示例2

Java代碼 技術分享
  1. import java.util.Scanner;
  2. public class ScannerLongTest {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. // System.in代表標準輸入,就是鍵盤輸入
  8. Scanner sc = new Scanner(System.in);
  9. // 判斷是否還有下一個long型整數
  10. while(sc.hasNextLong())
  11. {
  12. // 輸出輸入項
  13. System.out.println("鍵盤輸入的內容是:"
  14. + sc.nextLong());
  15. }
  16. }
  17. }

運行結果

12

鍵盤輸入的內容是:12

34

鍵盤輸入的內容是:34

56

鍵盤輸入的內容是:56

代碼說明

Scanner可以獲取任何基本類型的輸入項目。

代碼示例3

Java代碼 技術分享
  1. import java.io.File;
  2. import java.util.Scanner;
  3. public class ScannerFileTest {
  4. public static void main(String[] args) throws Exception {
  5. // 將一個File對象作為Scanner的構造器參數,Scanner讀取文件內容
  6. Scanner sc = new Scanner(new File("ScannerFileTest.java"));
  7. System.out.println("ScannerFileTest.java文件內容如下:");
  8. // 判斷是否還有下一行
  9. while(sc.hasNextLine())
  10. {
  11. // 輸出文件中的下一行
  12. System.out.println(sc.nextLine());
  13. }
  14. }
  15. }

運行結果

F:\java\workspace\first\bin>java ScannerFileTest

ScannerFileTest.java文件內容如下:

import java.io.File;

import java.io.FileNotFoundException;

import java.util.Scanner;

public class ScannerFileTest {

public static void main(String[] args) throws FileNotFoundException {

// 將一個File對象作為Scanner的構造器參數,Scanner讀取文件內容

Scanner sc = new Scanner(new File("ScannerFileTest.java"));

System.out.println("ScannerFileTest.java文件內容如下:");

// 判斷是否還有下一行

while(sc.hasNextLine())

{

// 輸出文件中的下一行

System.out.println(sc.nextLine());

}

}

}

代碼說明

此代碼創建Scanner對象時傳入一個File對象作為參數,這表明該程序會讀取ScannerFileTest.java文件中的內容。此代碼使用了hasNextLine和nextline兩個方法讀取文件內容。


Java對字符串支持還是比較弱的,盡管Java一直在努力。
http://bbs.itheima.com/thread-90856-1-1.html
(出處: 黑馬程序員IT技術論壇)

java 中的Scanner