כיתת ה-Scanner של Java היא חלק מחבילת java.util. נוספה בגרסת Java 1.5. ה-Scanner משמש בעיקר לקבלת קלט מהמשתמש ולפענח אותם לטיפוסי נתונים פרימיטיביים כמו int, double או String ברירת מחדל. זו כיתת יעוץ לניתוח נתונים באמצעות רגולריות על ידי יצירת קטעי קוד.
בנאי כיתת Scanner של Java
אם תביט בכיתת ה-Scanner, תראה שישנם הרבה בנאים.

רוב הבנאים משתמשים באחד משלושת האובייקטים הבאים:
- InputStream – הכי נפוץ בו אנו מעבירים System.in כדי לקבל קלט מהמשתמש.
- קובץ או נתיב – ניתן לסרוק נתוני קובץ גם ולעבוד עם הערכים מהקובץ.
- מחרוזת – אפשר ליצור סורק עבור מקור מחרוזת ולפענח ערכים ממנה.
אם תביט בפרמטר השני, הוא משמש לציון סט תווים אם אינך רוצה להשתמש בסט תווים ברירת המחדל לניתוח.
שיטות חשובות של כיתת Scanner
בוא נביט בכמה מהשיטות הנפוצות ביותר של כיתת Scanner.
- useDelimiter(String pattern) – המפריד לשימוש בסורק. המפריד ברירת המחדל הוא רווח לבן.
- hasNext() – מחזיר אמת אם יש טוקן נוסף בקלט. זו שיטה חוסמת והיא תמשיך להמתין לקלט מהמשתמש.
- next() – מחזיר את הטוקן הבא מהסורק. משמש בשילוב עם השיטה hasNext().
- close() – הסורק דורש המון משאבים, אז כאשר סיימת להשתמש בו, עליך להשתמש בשיטה זו כדי לסגור אותו ולשחרר משאבי מערכת.
ישנם המון שיטות יוטיליטי לבדיקה ולפירוש ישיר של הטוקן הקלט לתוך int, short, long, byte, BigDecimal ועוד.
שלבים להקמה ושימוש בסורק
- השלב הראשון הוא להקים את מחלקת הסורק באמצעות בנאי המתאים בהתאם לסוג הקלט כמו InputStream, File, או String. אם נדרש, יש להגדיר את המפריד וסט תווים לשימוש.
- השלב השני הוא להמתין לטוקן הקלט באמצעות שיטת hasNext().
- לאחר מכן, יש להשתמש בשיטה next() כדי לקרוא את הטוקן ולעבד אותם אחד לאחד.
כיצד עובד הסורק?
- מחלקת הסורק פוצצת את הקלט שלה לטוקנים באמצעות תבנית המפריד שצוינה.
- השיטות next() משמשת לקריאת הטוקנים אחד לאחד ולעבד אותם.
- סוף סוף, סגור את מופע הסורק כדי לשחרר משאבי מערכת.
דוגמאות לסורק
בואו נסתכל על כמה מהשימושים הנפוצים של כיתת הסורק עם קטעי קוד לדוגמה.
1. קריאת קלט משתמש
זו השימוש הנפוץ ביותר של כיתת הסורק. נוכל ליצור מופע עם System.in כמקור קלט ולקרוא את קלט המשתמש.
// קריאת קלט משתמש
Scanner sc = new Scanner(System.in);
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();
פלט:
Please enter your name
Pankaj
Hello Pankaj
כך זה נראה פשוט ועובד כמו שצריך. אך, יש בעיה עם הקוד ללא קריאה לחלק הבא, האם תוכל לבדוק את הקוד ולנסות לזהות את הבעיה לפני שתקרא לחלק הבא?
בואו נראה מה קורה כאשר אני רושם את שמי המלא בקלט.
Please enter your name
Pankaj Kumar
Hello Pankaj
עכשיו כבר צריך שתבין, זה קורה מכיוון שרווח הוא המפריד. הסורק פורץ את הקלט לשני טוקנים – Pankaj ו-Kumar. אך אנו קוראים לשיטת next() רק פעם אחת, ולכן רק "שלום Pankaj" מודפס.
איך אפשר לתקן זאת?
זה פשוט. אנו יכולים לשנות את המפריד לתו חדש באמצעות שיטת useDelimiter().
Scanner sc = new Scanner(System.in);
sc.useDelimiter(System.getProperty("line.separator"));
System.out.println("Please enter your name");
String name = sc.next();
System.out.println("Hello " + name);
sc.close();
2. ניתוח נתוני קובץ באמצעות Scanner
בואו נסתכל על דוגמה פשוטה לקריאה ולניתוח של קבצי CSV באמצעות מחלקת הסורק. נניח, יש לי קובץ employees.csv עם התוכן הבא.
1,Jane Doe,CEO
2,Mary Ann,CTO
3,John Lee,CFO
בואו נקרא את הקובץ ונקבל רשימת עובדים בתוכנית ה-Java שלנו.
package com.journaldev.java;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ScannerExamples {
public static void main(String[] args) throws IOException {
// create scanner for the CSV file
Scanner sc = new Scanner(new File("employees.csv"));
// set delimiter as new line to read one line as a single token
sc.useDelimiter(System.getProperty("line.separator"));
// create the List of Employees
List<Employee> emps = new ArrayList<>();
while (sc.hasNext()) {
Employee emp = parseEmployeeData(sc.next());
emps.add(emp);
}
// close the scanner
sc.close();
// print employee records
System.out.println(emps);
}
private static Employee parseEmployeeData(String record) {
// create scanner for the String record
Scanner sc = new Scanner(record);
// set delimiter as comma
sc.useDelimiter(",");
Employee emp = new Employee();
emp.setId(sc.nextInt());
emp.setName(sc.next());
emp.setRole(sc.next());
// close the scanner
sc.close();
return emp;
}
}
class Employee {
private int id;
private String name;
private String role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@Override
public String toString() {
return "Emp[" + id + "," + name + "," + role + "]";
}
}
- // יצירת סורק עבור קובץ ה-CSV
- // הגדרת הפריד כשורה חדשה כדי לקרוא שורה אחת כטוקן יחיד
- // יצירת רשימת העובדים
// סגירת הסורק
// הדפסת רשומות העובד
// יצירת סורק עבור רשומת המחרוזת
// הגדרת הפריד כפסיק
String data = "1a2b345c67d8,9#10";
Scanner sc1 = new Scanner(data);
// סגירת הסורק
sc1.useDelimiter("\\D");
while(sc1.hasNext()) {
System.out.println(sc1.next());
}
השלב הראשון הוא ליצור את הסורק עבור קובץ ה-CSV ולהגדיר שורה חדשה כפריד.
sc1.close();
אז עבור כל שורה שמכילה רשומת עובד בפורמט של CSV, ננתח אותה באמצעות סורק נוסף ופסיק כפריד. הפונקציה parseEmployeeData() מנתחת כל שורה ויוצרת אובייקט של עובד.
1
2
345
67
8
9
10
לבסוף, אנו מוסיפים את אובייקט העובד לרשימה ומדפיסים אותו.
פלט: [עובד[1, ג'יין דו, מנכ"ל], עובד[2, מרי אן, סמנכ"ל טכני], עובד[3, ג'ון לי, סמנכ"ל כספים]]
Source:
https://www.digitalocean.com/community/tutorials/scanner-class-in-java