סורק ג'אווה

1. סקירה כללית של סוֹרֵק

במדריך מהיר זה נמחיש כיצד להשתמש ב- ג'אווה סוֹרֵק בכיתה - לקרוא קלט, למצוא ולדלג על תבניות עם תווים שונים.

2. סרוק קובץ

ראשית - בואו נראה איך לקרוא קובץ באמצעות סוֹרֵק.

בדוגמה הבאה - קראנו קובץ המכיל "שלום עולם"לאסימונים:

@ מבחן ציבורי בטל כאשר ReadFileWithScanner_thenCorrect () זורק IOException {סורק סורק = סורק חדש (קובץ חדש ("test.txt")); assertTrue (scanner.hasNext ()); assertEquals ("שלום", scanner.next ()); assertEquals ("עולם", scanner.next ()); scanner.close (); }

שים לב שה- הַבָּא() השיטה מחזירה את הבאה חוּט אסימון כאן.

כמו כן, שים לב כיצד אנו סוגרים את הסורק לאחר שסיימנו להשתמש בו.

3. להמיר InputStream ל חוּט

הבא - בואו נראה איך להמיר InputStream לתוך חוּט באמצעות א סוֹרֵק:

@Test ציבורי בטל כאשרConvertInputStreamToString_thenConverted () זורק IOException {String expectValue = "שלום עולם"; FileInputStream inputStream = FileInputStream חדש ("test.txt"); סורק סורק = סורק חדש (inputStream); scanner.useDelimiter ("A"); תוצאת מחרוזת = scanner.next (); assertEquals (expectValue, result); scanner.close (); }

בדומה לדוגמא הקודמת, השתמשנו ב- סוֹרֵק כדי לסמל את כל הזרם מההתחלה ל regex הבא "A" - שתואם את הקלט המלא.

4. סוֹרֵק לעומת. BufferedReader

עכשיו - בואו נדבר על ההבדל בין סוֹרֵק ו BufferedReader - אנו משתמשים בדרך כלל ב:

  • BufferedReader כשאנחנו רוצים לקרוא את הקלט לשורות
  • סוֹרֵק לקרוא את הקלט לתוך אסימונים

בדוגמה הבאה - אנו קוראים קובץ לשורות באמצעות BufferedReader:

@Test הציבור בטל כאשרReadUsingBufferedReader_thenCorrect () זורק IOException {String firstLine = "שלום עולם"; מחרוזת secondLine = "היי, ג'ון"; BufferedReader reader = BufferedReader חדש (FileReader חדש ("test.txt")); תוצאת מחרוזת = reader.readLine (); assertEquals (firstLine, תוצאה); תוצאה = reader.readLine (); assertEquals (secondLine, תוצאה); reader.close (); }

עכשיו, בואו נשתמש סוֹרֵק לקרוא את אותו הקובץ לאסימונים:

@ מבחן ציבורי בטל כאשר ReadUsingScanner_thenCorrect () זורק IOException {String firstLine = "שלום עולם"; FileInputStream inputStream = FileInputStream חדש ("test.txt"); סורק סורק = סורק חדש (inputStream); תוצאת מחרוזת = scanner.nextLine (); assertEquals (firstLine, תוצאה); scanner.useDelimiter (","); assertEquals ("היי", scanner.next ()); assertEquals ("ג'ון", scanner.next ()); scanner.close (); }

שים לב כיצד אנו משתמשים ב- סוֹרֵקnextLine () API - לקרוא את כל השורה.

5. סריקת קלט מהקונסולה באמצעות סורק חדש (System.in)

הבא - בואו נראה איך לקרוא קלט מהקונסולה באמצעות a סוֹרֵק למשל:

@ מבחן ציבורי בטל whenReadingInputFromConsole_thenCorrect () {String input = "שלום"; InputStream stdin = System.in; System.setIn (ByteArrayInputStream חדש (input.getBytes ())); סורק סורק = סורק חדש (System.in); תוצאת מחרוזת = scanner.next (); assertEquals (קלט, תוצאה); System.setIn (stdin); scanner.close (); }

שימו לב שהשתמשנו System.setIn (...) כדי לדמות קלט כלשהו שמגיע מהקונסולה.

5.1. nextLine () ממשק API

שיטה זו פשוט מחזירה את המחרוזת בשורה הנוכחית:

scanner.nextLine ();

זה קורא את תוכן השורה הנוכחית ומחזיר אותו למעט כל מפריד שורות בסוף - במקרה זה - תו השורה החדש.

לאחר קריאת התוכן, סוֹרֵק מגדיר את מיקומו לתחילת השורה הבאה. הנקודה החשובה שיש לזכור היא שה- nextLine () API צורך את מפריד השורות ומזיז את המיקום של ה- סוֹרֵק לשורה הבאה.

אז בפעם הבאה אם ​​נקרא סוֹרֵק נקרא מתחילת השורה הבאה.

5.2. nextInt () ממשק API

שיטה זו סורקת את האסימון הבא של הקלט כ- int:

scanner.nextInt ();

ה- API קורא את האסימון השלם הזמין בהמשך.

במקרה זה, אם האסימון הבא הוא מספר שלם ואחרי המספר השלם, יש מפריד קו, זכרו תמיד nextInt () לא ייצרך את מפריד השורות. במקום זאת, המיקום של הסורק יהיה מפריד הקווים עצמו.

אז אם יש לנו סדרה של פעולות, כאשר הפעולה הראשונה היא a scanner.nextInt () ואז scanner.nextLine () וכקלט אם אנו מספקים מספר שלם והפסקת שורות הקש, שתי הפעולות יבוצעו.

ה nextInt () API ייצרך את המספר השלם ואת ה- nextLine () API ייצרך את מפריד השורות ויוצב סוֹרֵק לתחילת השורה הבאה.

6. אמת קלט

עכשיו - בואו נראה כיצד לאמת קלט באמצעות a סוֹרֵק. בדוגמה הבאה - אנו משתמשים ב- סוֹרֵק שיטה hasNextInt () כדי לבדוק אם הקלט הוא ערך שלם:

@Test ציבורי בטל כאשרValidateInputUsingScanner_thenValidated () זורק IOException {String input = "2000"; InputStream stdin = System.in; System.setIn (ByteArrayInputStream חדש (input.getBytes ())); סורק סורק = סורק חדש (System.in); isIntInput בוליאני = scanner.hasNextInt (); assertTrue (isIntInput); System.setIn (stdin); scanner.close (); }

7. סרוק א חוּט

הבא - בואו נראה איך לסרוק א חוּט באמצעות סוֹרֵק:

@ מבחן ציבורי בטל כאשר ScanString_thenCorrect () זורק IOException {String input = "שלום 1 F 3.5"; סורק סורק = סורק חדש (קלט); assertEquals ("שלום", scanner.next ()); assertEquals (1, scanner.nextInt ()); assertEquals (15, scanner.nextInt (16)); assertEquals (3.5, scanner.nextDouble (), 0.00000001); scanner.close (); }

הערה: השיטה nextInt (16) קורא את האסימון הבא כערך שלם הקסדצימלי.

8. מצא תבנית

עכשיו - בואו נראה איך למצוא א תבנית באמצעות סוֹרֵק.

בדוגמה הבאה - אנו משתמשים findInLine () ל חפש אסימון שתואם את הנתון תבנית בכל הקלט:

@Test הציבור בטל כאשרFindPatternUsingScanner_thenFound () זורק IOException {String expectValue = "world"; FileInputStream inputStream = FileInputStream חדש ("test.txt"); סורק סורק = סורק חדש (inputStream); תוצאת מחרוזת = scanner.findInLine ("wo..d"); assertEquals (expectValue, result); scanner.close (); }

אנחנו יכולים גם לחפש תבנית בתחום הספציפי באמצעות findWithinHorizon () כמו בדוגמה הבאה:

@ מבחן ציבורי בטל כאשר FindPatternInHorizon_thenFound () זורק IOException {String expectValue = "world"; FileInputStream inputStream = FileInputStream חדש ("test.txt"); סורק סורק = סורק חדש (inputStream); תוצאת מחרוזת = scanner.findWithinHorizon ("wo..d", 5); assertNull (תוצאה); תוצאה = scanner.findWithinHorizon ("wo..d", 100); assertEquals (expectValue, result); scanner.close (); }

שים לב שה- אופק החיפוש הוא פשוט מספר התווים במסגרתו מתבצע החיפוש.

9. דלג תבנית

הבא - בואו נראה איך לדלג על a תבנית ב סוֹרֵק. אנו יכולים לדלג על אסימונים התואמים לדפוס ספציפי בזמן קריאת הקלט באמצעות סוֹרֵק.

בדוגמה הבאה - אנו מדלגים על "שלוםאסימון באמצעות סוֹרֵק שיטה לדלג():

@ מבחן פומבי בטל כאשר SkipPatternUsingScanner_thenSkipped () זורק IOException {FileInputStream inputStream = FileInputStream חדש ("test.txt"); סורק סורק = סורק חדש (inputStream); scanner.skip (". e.lo"); assertEquals ("עולם", scanner.next ()); scanner.close (); }

10. לשנות סוֹרֵק מפריד

לבסוף - בואו נראה כיצד לשנות את ה- סוֹרֵק תוחם. בדוגמה הבאה - אנו משנים את ברירת המחדל סוֹרֵק תוחם את "o“:

@ מבחן ציבורי בטל כאשרChangeScannerDelimiter_thenChanged () זורק IOException {String expectValue = "שלום עולם"; מחרוזת [] מפוצלת = expectValue.split ("o"); FileInputStream inputStream = FileInputStream חדש ("test.txt"); סורק סורק = סורק חדש (inputStream); scanner.useDelimiter ("o"); assertEquals (מפוצל [0], scanner.next ()); assertEquals (מפוצל [1], scanner.next ()); assertEquals (מפוצל [2], scanner.next ()); scanner.close (); }

אנו יכולים גם להשתמש במפרידים מרובים. בדוגמה הבאה - אנו משתמשים בשתי הפסיקים ","ומקף""כמפריד לסריקת קובץ מכיל"ג'ון, אדם-טום“:

@ מבחן ציבורי בטל כאשר ReadWithScannerTwoDelimiters_thenCorrect () זורק IOException - "); assertEquals (" John ", scanner.next ()); assertEquals (" Adam ", scanner.next ()); assertEquals (" Tom ", scanner.next () scanner.close (); 

הערה: בְּרִירַת מֶחדָל סוֹרֵק תוחם הוא מרחב לבן.

11. מסקנה

במדריך זה, עברנו על מספר דוגמאות בעולם האמיתי לשימוש ב- סורק ג'אווה.

למדנו כיצד לקרוא קלט מקובץ, מסוף או חוּט באמצעות סוֹרֵק; למדנו גם כיצד למצוא ולדלג על תבנית באמצעות סוֹרֵק כמו גם כיצד לשנות את סוֹרֵק תוחם.

ניתן למצוא את היישום של דוגמאות אלה ב- GitHub.