JavaRush /Java Blog /Random-TW /Java 中的掃描器類

Java 中的掃描器類

在 Random-TW 群組發布
你好!今天我們的課很特別!在此之前,當解決問題和編寫程式時,演算法很簡單:我們編寫一些程式碼,運行main()方法,程式執行所需的操作,然後退出。但現在一切都將改變!今天我們將學習如何真正與程式互動:我們將教導它回應我們的行為!您可能已經明白我們要做什麼了。本次講座我們將詳細分析 Java 語言類別之一—Scanner。如果您需要讀取用戶輸入的數據,此類將很有用。在我們繼續學習程式碼之前,請告訴我,您曾經遇到過掃描器這樣的設備嗎?當然是的。掃描器的內部結構相當複雜,但其工作的本質卻相當簡單:它讀取使用者輸入的資料(例如護照或保險單)並將讀取的資訊儲存在記憶體中(例如,以影像的形式)。所以,今天您將創建自己的掃描器!當然,他不能處理文檔,但他可以很好地處理文字訊息:) 走吧!掃描器類別 - 1

Java 掃描器類

我們需要熟悉的第一個也是最重要的事情就是類別java.util.Scanner。它的功能非常簡單。就像真正的掃描器一樣,它從您為其指定的來源讀取資料。例如,從一行、從文件、從控制台。然後它會識別該資訊並根據需要進行處理。我們舉個最簡單的例子:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
我們創建了一個掃描器物件並為其指定了一個資料來源(帶有文字的字串)。此方法nextLine()存取資料來源(我們的帶有絕句的文字),找到尚未讀取的下一行(在我們的例子中是第一行)並傳回它。之後我們將其輸出到控制台: 控制台輸出:

Люблю тебя, Peterа творенье,
我們可以多次使用該方法nextLine()並輸出整首詩:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
每次我們的掃描器都會向前一步並讀取下一行。程式的結果輸出到控制台:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
正如我們已經說過的,掃描器的資料來源不僅可以是字串,還可以是控制台等。對我們來說重要的消息:如果以前我們只在那裡輸出數據,現在我們將從鍵盤輸入數據!讓我們看看Scanner類別還能做什麼:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
此方法nextInt()讀取並傳回輸入的數字。在我們的程式中,它用於給變數賦值number。這看起來更像是真正的掃描器!程式要求使用者在一行中輸入任意數字。用戶完成此操作後,程式會感謝他,在控制台上顯示其工作結果並結束。但我們仍然面臨一個嚴重的問題。使用者可能會犯錯並輸入錯誤的內容。 這是我們目前的程式何時停止工作的範例:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
讓我們嘗試輸入字串“JavaRush”而不是數字: 控制台輸出:
Enter the number:
JavaRush
Exception in thread "main" java.util.InputMismatchException
  at java.util.Scanner.throwFor(Scanner.java:864)
  at java.util.Scanner.next(Scanner.java:1485)
  at java.util.Scanner.nextInt(Scanner.java:2117)
  at java.util.Scanner.nextInt(Scanner.java:2076)
  at Main.main(Main.java:10)

Process finished with exit code 1
糟糕,一切都很糟糕 -_- 為了避免這種情況,我們需要想出一種方法來驗證使用者輸入的資料。例如,使用者輸入數字以外的任何內容,最好在控制台中顯示警告,表示輸入的資訊不是數字,如果一切正常,則顯示確認文字。但要做到這一點,我們實際上需要「展望未來」——找出我們流程中的下一步。Java中的Scanner可以做到這一點嗎?他怎麼可以!為此,它有一整組方法: hasNextInt()- 此方法檢查輸入資料的下一部分是否為數字(分別傳回 true 或 false)。 hasNextLine()— 檢查下一筆資料是否為字串。 hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- 所有這些方法對於其他資料類型的作用都是相同的。讓我們嘗試更改我們的程式來讀取數字:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thank you! You entered a number" + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
現在我們的程式檢查輸入的下一個字元是否是數字。僅當是時,它才會顯示確認訊息。如果輸入未通過測試,程式會注意到這一點並要求您重試。本質上,您可以與 Scanner 物件進行通信,並提前知道期望的資料類型。「嘿,掃描儀,下一步是什麼?數字、字串還是其他?數字?哪一個—— int、、shortlong” 這種靈活性使您有機會根據使用者行為建立程式邏輯。另一個值得關注的重要方法是useDelimiter()。此方法將傳遞要用作分隔符號的字串。例如,我們突然對日本詩歌產生了興趣,決定用掃描器閱讀大詩人松尾芭蕉的幾首俳句。即使在一行笨拙的行中給出了三段不同的經文,我們也可以輕鬆地將它們分開並很好地格式化它們:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a Bare Branch" +
               "Raven sits alone.'" +
               "Autumn evening." +
               "''***''" +
               "There's such a moon in the sky,'" +
               "Like a tree cut down at the root:'" +
               "A fresh cut turns white." +
               "''***''" +
               "How the river has overflowed!" +
               "The heron wanders on short legs,'" +
               "Knee-deep in water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
我們使用Scanner類別的useDelimeter()方法 作為行分隔符號:它負責將傳入的資料分成幾個部分。在我們的例子中,單引號( “'” )作為參數傳遞並用於分隔字串。此引用後面的文字出現在新行中,因為在 while 迴圈中我們使用System類別的println()方法來讀取資料。結果,我們將在控制台中得到漂亮的輸出,就像書中一樣:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

*** 
 
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
在同一個例子中,還有一種方法你一定要注意 - close()。與任何使用 I/O 流的物件一樣,掃描器應在其工作完成後關閉,以便它不再消耗我們的電腦資源。 永遠不要忘記方法close()
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

       sc.close();//Now we did everything right!

   }
}
就這樣!正如您所看到的,Scanner 類別非常易於使用且非常有用!:)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION