فئة Scanner في جافا هي جزء من حزمة java.util. تمت إضافتها في إصدار جافا 1.5. يُستخدم معظمها لاستقبال إدخال المستخدم وتحليله إلى أنواع بيانات أساسية مثل int، double، أو String الافتراضي. إنها فئة مفيدة لتحليل البيانات باستخدام تعابير منتظمة عن طريق إنشاء رموز.
بناة فئة Scanner في جافا
إذا نظرت إلى فئة Scanner، ستجد العديد من بناتها.

معظم بناتها تستخدم أحد الكائنات الثلاثة:
- InputStream – الأكثر شيوعًا حيث نمرر System.in لاستقبال إدخال المستخدم.
- ملف أو مسار – يمكننا مسح بيانات الملف أيضًا والعمل مع القيم من الملف.
- سلسلة – يمكننا إنشاء ماسح لمصدر سلسلة أيضًا وتحليل القيم منها.
إذا نظرت إلى الوسيطة الثانية، فهي لتحديد مجموعة أحرف إذا لم تكن ترغب في استخدام مجموعة أحرف الافتراضية للتحليل.
أهم الطرق في فئة Scanner
لنلقِ نظرة على بعض الطرق الأكثر استخدامًا في فئة Scanner.
- useDelimiter(String pattern) – المحدد الذي سيتم استخدامه للماسح. المحدد الافتراضي هو المسافة البيضاء.
- يعود hasNext() – بإرجاع قيمة صحيحة إذا كان هناك رمز آخر في الإدخال. إنها طريقة تكتل وسوف تظل في انتظار إدخال المستخدم.
- next() – يقوم بإرجاع الرمز التالي من الماسح الضوئي. يتم استخدامه بالتزامن مع طريقة hasNext().
- close() – الماسح الضوئي يتطلب موارد كبيرة، لذا بمجرد الانتهاء من استخدامه، استخدم هذه الطريقة لإغلاقه وتحرير موارد النظام.
هناك العديد من الطرق الفعالة لفحص وتحليل مباشر لرمز الإدخال إلى int، short، long، byte، BigDecimal، إلخ.
خطوات تهيئة واستخدام الماسح
- الخطوة الأولى هي تهيئة فئة الماسح باستخدام البناء المناسب استنادًا إلى نوع الإدخال مثل InputStream، File، أو String. إذا لزم الأمر، قم بتعيين المحدد ومجموعة الأحرف المستخدمة.
- الخطوة الثانية هي الانتظار لرمز الإدخال باستخدام طريقة hasNext().
- ثم استخدم طريقة next() لقراءة الرمز ومعالجتها واحدة تلو الأخرى.
كيف يعمل الماسح؟
- تقسم فئة الماسح إدخالها إلى رموز باستخدام نمط المحدد المحدد.
- تستخدم طرق next() لقراءة الرموز واحدة تلو الأخرى ومعالجتها.
- أخيرًا، قم بإغلاق مثيل Scanner لتحرير موارد النظام.
أمثلة على ماسح
دعونا نلقي نظرة على بعض الاستخدامات الشائعة لفئة الماسح مع مقاطع كود عينية.
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
الآن يجب أن تكون قد فهمت، هذا يحدث لأن الفراغ الأبيض هو الفاصل. الماسح يقوم بتقسيم الإدخال إلى رمزين – بانكاج وكومار. ولكن، نحن نقوم بالاتصال بالطريقة next() مرة واحدة فقط، لذلك يتم طباعة “مرحبًا بانكاج” فقط.
كيف يمكننا إصلاح هذا؟
إنه بسيط. يمكننا تغيير الفاصل إلى حرف السطر الجديد باستخدام طريقة 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. تحليل بيانات الملف باستخدام الماسح الضوئي
لنلقي نظرة على مثال بسيط لقراءة وتحليل ملفات 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
أخيرًا، نقوم بإضافة كائن الموظف إلى القائمة وطباعته.
الناتج: [Emp[1,Jane Doe,CEO], Emp[2,Mary Ann,CTO], Emp[3,John Lee,CFO]]
Source:
https://www.digitalocean.com/community/tutorials/scanner-class-in-java