Scanner در جاوا چیست؟ – توضیح ساده کلاس اسکنر + مثال
![Scanner در جاوا چیست؟ – توضیح ساده کلاس اسکنر + مثال](https://blog.faradars.org/wp-content/webp-express/webp-images/doc-root/wp-content/uploads/2023/09/what-is-scanner-class-in-java.jpg.webp)
در زبان برنامه نویسی جاوا کلاس Scanner به عنوان ابزاری برای دریافت اطلاعات از ورودی مورد استفاده قرار میگیرد. به طور کلی هر برنامه و نرمافزاری نیازمند ارتباط دو سویه با کاربر است و برای همین منظور نیز طراحان زبان جاوا کلاس Scanner را در اختیار توسعهدهندگان قرار دادهاند. کلاس Scanner در جاوا با فراهم آوردن متدهای مختلف جهت کنترل ورودی و پردازش آنها امکانات بسیار خوبی را در امر توسعه فراهم میکند. بر همین اساس در این مطلب از مجله فرادرس به این سوال پاسخ داده خواهد شد که کلاس Scanner در جاوا چیست و چه کاربردهایی دارد. علاوه بر این، با مطالعه این مطلب مراحل پیادهسازی این کلاس از ایجاد شی گرفته تا به کار بردن متدهای مختلف آن را فرا خواهید گرفت. در انتها نیز ضمن بیان مزایا و معایب استفاده از این کلاس در جاوا، چند مثال از کاربردهای عملی Scanner نیز آورده شده است.
کلاس Scanner در جاوا چیست؟
Scanner یکی از کلاسهای موجود در بسته نرمافزاری جاوا است. هدف اصلی کلاس Scanner در جاوا فراهم آوردن امکانی برای برقراری ارتباط دو سویه بین کاربر و نرمافزار است. به بیانی دیگر این کلاس امکانی را برای وارد کردن اطلاعات کاربر به برنامه ایجاد میکند تا نرمافزار به کمک این اطلاعات عملکرد مناسب را ارائه دهد.
کلاس Scanner از اهمیت بسیار بالایی برخوردار است، زیرا امروزه تمام برنامهها نیازمند راهی برای تعامل با کاربر و دریافت دادههای مورد نیاز هستند. طراحان زبان برنامه نویسی جاوا با در نظر گرفتن اهمیت این مسئله کلاس Scanner در جاوا را برای آسان نمودن برقراری ارتباط بین نرمافزار و کاربر پیادهسازی کردند. این مسئله به ويژه در نرمافزارهایی با میزان تعامل زیاد با کاربر از اهمیت بیشتری نیز برخوردار است، زیرا تعاملات بین کاربر و نرمافزار باید به آسانترین شکل ممکن صورت گیرد.
کاربرد Scanner در جاوا چیست؟
کاربرد کلاس Scanner در جاوا فراهم آوردن امکانی برای ایجاد تعامل بین کاربر و نرمافزار است. به عنوان مثال، توسعهدهندگان وب در هنگام ساخت وبسایتهای مختلف به کمک جاوا میتوانند از این کلاس برای پیادهسازی امکان ثبتنام و ورود کاربر به برنامه استفاده کنند. همچنین، به کمک متدهای موجود در کلاس Scanner میتوان از ورود کاراکترهای غیرمجاز در کادرهای ورود داده جلوگیری کرد. همچنین، میتوان از Scanner برای کنترل فرمت دادهها قبل از درج آنها در «پایگاهداده» (Database) نرمافزار یا وبسایت اطمینان حاصل کرد.
![کامپیوتر احاطه شده بین کدها - کاربرد Scanner در جاوا چیست](https://blog.faradars.org/wp-content/uploads/2023/09/usage-of-scanner-class-in-java.jpg)
مراحل پیادهسازی Scanner در جاوا
کلاس Scanner در جاوا زیر مجموعه پکیج java.util است و از نسخه 1.5 جاوا در دسترس قرار گرفت. این کلاس برای دریافت ورودی از کاربر و تجزیه آن به نوعهای دادهای مختلف همچون «عدد صحیح» (Inteager)، «عدد اعشاری» (Double)، «رشته» (String) و سایر موارد مورد استفاده قرار میگیرد.
Scanner در جاوا کلاسی کاربردی برای تجزیه دادهها با استفاده از «عبارات منظم» (Regular Expression) است. در ادامه با مراحل پیادهسازی Scanner در جاوا آشنا خواهید شد.
گام اول: وارد کردن پکیج Scanner در برنامه
همانند هر کلاس یا کتابخانه دیگری در جاوا برای استفاده از Scanner باید پکیج مربوط به آن را در ابتدای برنامه قرار داد. همانطور که در ابتدای این بخش نیز عنوان شد، کلاس Scanner زیر مجموعه پکیج بسیار معروف java.util در جاوا است. در نتیجه، در گام نخست باید کد زیر را برای افزودن پکیج Scanner در برنامه قرار داد.
1import java.util.Scanner;
افزودن پکیج Scanner در برنامه به آسانی و تنها با نوشتن کد بالا صورت میگیرد.
گام دوم: آشنایی با توابع سازنده کلاس Scanner در جاوا
توابع «سازنده» (Constructor) یکی از مفاهیم اصلی در جاوا و «برنامه نویسی شیگرا» (Object Oriented Programming | OOP) هستند. این توابع در واقع راهنما و مدلی برای ساخت یک نمونه یا شی از کلاس را فراهم میکنند. با استفاده از این توابع امکان تعیین ویژگیها و متدهای مورد نیاز برای شی مورد نظر وجود دارد. کلاس Scanner در جاوا نیز برای همین منظور توابع سازنده مختلفی با قابلیتهای متنوع ارائه داده است. در تصویر زیر فهرستی از توابع سازنده موجود در کلاس Scanner ارائه شده است.
نوعهای دادهای زیر به عنوان آرگومانهای ورودی در بیشتر توابع سازنده مشترک هستند.
- InputStream : این نوع دادهها اطلاعات ورودی را به صورت دنباله مرتب شدهای از بایتها در اختیار شی مورد نظر از کلاس Scanner قرار میدهند.
- File or Path : با تعیین این نوع دادهای، ورودی از طریق دادههای موجود در فایل دریافت میشود.
- String : با تعیین این نوع دادهای، اطلاعات ورودی به صورت رشته در اختیار کلاس Scanner قرار میگیرد.
همچنین، با بررسی آرگومان دوم موجود در برخی از توابع سازنده امکان تعیین مجموعهای از کاراکترها برای تجزیه به جای کاراکترهای پیشفرض وجود دارد. این آرگومان تحت عنوان Charset در برخی از توابع سازنده مشخص شده است.
گام سوم: ساخت شی از کلاس Scanner در جاوا
بعد از واردن کردن پکیج Scanner در برنامه و آشنایی با توابع سازنده آن باید یک شی از این کلاس ایجاد کرد. با توجه به نوع ورودی دریافتی برنامه باید تابع سازنده مناسب برای ساخت شی را انتخاب کرد. در ادامه، نحوه ساخت شی از کلاس Scanner با توجه به ورودی برنامه ارائه شده است.
- ورودی از نوع InputStream
1// read input from the input stream
2Scanner sc1 = new Scanner(InputStream input);
- ورودی از نوع File
1// read input from files
2Scanner sc2 = new Scanner(File file);
- ورودی از نوع رشته
1// read input from a string
2Scanner sc3 = new Scanner(String str);
گام چهارم: آشنایی با متدهای کلاس Scanner در جاوا
کلاس Scanner در جاوا متدهای مختلفی را نیز برای بهبود فرایند دریافت اطلاعات از کاربر ارائه میدهد. به کمک متدهای متنوع موجود در کلاس Scanner میتوان قوانین و دستورالعملهای سخت گیرانهای برای دادههای ورودی از سمت کاربر نظیر نوع داده و مقدار داده اعمال کرد.
![برنامه نویس در حال کدنویسی - آشنایی با متدهای کلاس Scanner در جاوا](https://blog.faradars.org/wp-content/uploads/2023/09/getting-to-know-scanner-class-methods-in-java.jpg)
علاوه بر این، با ترکیب متدهای موجود در کلاس Scanner با سایر عملکردها و ساختارهای برنامه نویسی میتوان آن را به ابزار بسیار قدرتمندی تبدیل کرد. به عنوان مثال، میتوان اطمینان حاصل کرد که تنها کاراکترهای مجاز و تایید شده در پایگاه داده نرمافزار درج شوند و از درج کاراکترهای غیرمجاز جلوگیری کرد. همچنین، در فرایند ساخت بازیهای ویدیویی نیز برای دریافت اطلاعات مربوط به شخصیت اصلی بازی نظیر نام میتوان از متدهای موجود در این کلاس استفاده کرد.
فهرست متدهای کلاس Scanner در جاوا
در ادامه فهرستی از متدهای موجود در کلاس Scanner به همراه کاربرد هر کدام ارائه شده است.
- nextInt() : یک مقدار از نوع عدد صحیح را از ورودی میخواند.
- nextFloat() : یک مقدار از نوع عدد اعشاری را تا نهایتاً ۳۲ رقم اعشار از ورودی دریافت میکند.
- nextBoolean() : یک مقدار «بولی» (Boolean) را از ورودی دریافت میکند.
- nextLine() : یک خط از اطلاعات را تا لحظه فشردن دکمه Enter از ورودی دریافت میکند.
- next() : این متد یک کلمه واحد را از ورودی میخواند. در این شرایط تا رسیدن به «فاصله خالی» (Whitespace) ورودی به خواندن ادامه میدهد و به بیان سادهتر نیز تا لحظه فشردن دکمه Space فرایند دریافت ورودی ادامه دارد.
- nextByte() : یک بایت از اطلاعات را از ورودی میخواند.
- nextDouble() : یک مقدار از نوع داده Double را از ورودی میخواند.
- nextShort() : یک مقدار از نوع داده Short را از ورودی دریافت میکند. محدوده این نوع دادهای بین مقدار ۳۲۷۶۸- تا ۳۲۷۶۷ است.
- nextLong() : این متد یک مقدار از نوع دادهای Long را دریافت میکند.
- useDelimiter() : این متد الگو جدا کننده Scanner در جاوا را تعیین میکند و مقدار آن به طور پیشفرض نیز کاراکتر خالی یا Whitespace است.
- close() : از این متد بعد از اتمام کار با Scanner استفاده میشود تا منابع سیستم آزاد شود.
- hasNext() : این متد در صورت قرار داشتن توکن دیگری در ورودی مقدار true را بر میگرداند و به صورت پیوسته منتظر دریافت ورودی از سمت کاربر است.
گام پنجم: پیادهسازی Scanner در جاوا
بعد از آشنایی با مراحل پیادهسازی Scanner در این بخش مثالی عملی از کاربرد این کلاس در جاوا ارائه شده است. برای این منظور حوزه بازیسازی را در نظر بگیرید که در فرایند ساخت شخصیت اصلی بازی به اطلاعات ورودی بسیاری نیاز است. معمولاً در این مرحله بازیها اطلاعات مشخصی همچون نام شخصیت، قد، وزن و سایر موارد را از کاربر درخواست میکنند. با دریافت اطلاعات از کاربر، بازی از این اطلاعات برای بخشهای مختلف نظیر گفتگو بین شخصیتهای بازی یا تنظیم ویژگیهای ظاهری کاراکتر بازی استفاده میکند. در ادامه، برای درک بهتر کاربرد Scanner در جاوا نمونه کد زیر آورده شده است.
1class Main
2{
3 public static void main(String[] args) {
4
5 Scanner userInput = new Scanner(System.in);
6 System.out.println("Please tell us your name:");
7
8 // String input
9 String name = userInput.nextLine();
10 //Pint user input
11 System.out.println("Welcome to Gallifrey: " + name);
12 }
13}
در نمونه کد بالا، شی userInput از کلاس Scanner ایجاد شده است. سپس، برنامه از کاربر درخواست میکند تا نام را وارد کند. به عنوان مثال، اگر کاربر نام Doctor Who را در این بخش وارد کند، آنگاه با استفاده از متد nextLine() این نام در متغیر name ذخیره میشود. در انتها نیز خروجی حاصل از اجرا نمونه کد بالا بعد از وارد کردن نام توسط کاربر به صورت زیر خواهد بود.
Welcome to Gallifrey, Doctor Whoهمچنین، در این مثال برای دریافت نام کاربر میتوان از متد next() به جای متد nextLine() استفاده کرد.
1// String
2inputString name = myObj.next();
در نتیجه، خواندن اطلاعات از ورودی تا رسیدن به فاصله خالی یا فشردن دکمه Space ادامه خواهد یافت. خروجی حاصل از استفاده از متد next() به جای متد nextLine() به صورت زیر خواهد بود.
Welcome to Gallifrey, Doctor
کلاس Scanner در جاوا چگونه کار میکند؟
کلاس Scanner در جاوا به کمک متدهای خود امکانی را برای دریافت و خواندن اطلاعات ورودی توسط کاربر فراهم میکند.
در ادامه مراحل دریافت و خواندن اطلاعات ورودی توسط این کلاس آورده شده است.
- کلاس Scanner با استفاده از الگو مشخص شده ورودی دریافتی را به بخشهای کوچکتر تقسیم میکند.
- سپس، با کمک متد next() به ترتیب بخشهای مشخص شده را خوانده و پردازش میکند.
- در نهایت، برای آزادسازی منابع سیستم به کمک متد Close() نمونه ساخته شده از کلاس Scanner بسته میشود.
مثالی از نحوه کار Scanner در جاوا
کلاس Scanner در جاوا هر خط از اطلاعات موجود در ورودی را میخواند و در فرایند پردازش اطلاعات آنها را به بخشهای کوچکتری به نام «توکن» (Token) تقسیم میکند. در واقع، توکنها عناصر کوچک قابل درک توسط کامپایلر جاوا هستند. به عنوان مثال، اطلاعات زیر را به عنوان ورودی در جاوا در نظر بگیرید.
He is 22
در این مثال، شی ایجاد شده از کلاس Scanner تمام خط ورودی را میخواند و آن را به توکنهای He ، is و 22 تقسیم میکند. سپس، شی بر روی توکنهای ایجاد شده عمل پیمایش را انجام میدهد و هر توکن را با متد مناسب از ورودی میخواند.
چند مثال از کاربرد Scanner در جاوا
با توجه به متدهای مختلف موجود در کلاس Scanner و امکان ترکیب این متدها با سایر ساختارهای موجود در دنیای برنامه نویسی میتوان از Scanner در بخشهای مختلفی استفاده کرد.
در ادامه برخی از کاربردهای رایج کلاس Scanner به همراه ارائه نمونه کد مورد بررسی قرار خواهد گرفت.
خواندن اطلاعات از ورودی
رایجترین کاربرد کلاس Scanner در جاوا خواندن اطلاعات از ورودی است. با استفاده از دستور System.in میتوان اطلاعات وارد شده توسط کاربر را به عنوان ورودی برنامه دریافت کرد. در ادامه، نمونه کد زیر نحوه دریافت اطلاعات از کاربر و نمایش آن در خروجی را نشان میدهد.
1// read user input
2Scanner sc = new Scanner(System.in); System.out.println("Please enter your name");
3String name = sc.next();
4System.out.println("Hello " + name);
5sc.close();
در قطعه کد بالا ابتدا یک شی از کلاس Scanner با نام sc ایجاد شده است. سپس، با چاپ عبارتی در خروجی به کاربر اطلاع میدهد تا نام خود را وارد کند. در ادامه، با استفاده از متد next() نام وارد شده توسط کاربر در متغیر name ذخیره و در خروجی نمایش داده خواهد شد. خروجی حاصل از اجرای نمونه کد بالا به صورت زیر خواهد بود.
Please enter your name Pankaj Hello Pankaj
در مثال بالا، کاربر تنها نام خود را وارد کرد. برای بررسی بهتر کد بالا این مرتبه نام و نام خانوادگی را همزمان وارد میکنیم. خروجی حاصل بعد از وارد نمودن نام کامل توسط کاربر به صورت زیر خواهد بود.
Please enter your name Pankaj Kumar Hello Pankaj
با وارد کردن نام کامل توسط کاربر تغییری در خروجی کد رخ نمیدهد، زیرا بین نام و نام خانوادگی کاربر فضای خالی وجود دارد. در اینجا Scanner ورودی را به دو بخش Pankaj و Kumar تقسیم میکند، اما متد next() تنها یک مرتبه فراخوانی میشود. در نتیجه، تنها عبارت Hello Pankaj در خروجی چاپ میشود. برای رفع این مشکل میتوان از متد useDelimiter() برای انتقال جدا کننده به کاراکتر جدید استفاده کرد. در ادامه تغییرات رخ داده در قطعه کد بالا بعد از استفاده از این متد نشان داده شده است.
1Scanner sc = new Scanner(System.in);
2sc.useDelimiter(System.getProperty("line.separator"));
3System.out.println("Please enter your name");
4String name = sc.next();
5System.out.println("Hello " + name);
6sc.close();
تجزیه اطلاعات فایل به کمک Scanner در جاوا
کاربرد مهم دیگر کلاس Scanner در جاوا تجزیه اطلاعات موجود در فایل است. در ادامه به بررسی مثالی ساده برای خواندن و تجزیه اطلاعات موجود در یک فایل با پسوند csv پرداخته خواهد شد. به عنوان گام نخست فایل employees.csv همراه با محتوای زیر را در نظر بگیرید.
1,Jane Doe,CEO 2,Mary Ann,CTO 3,John Lee,CFO
در ادامه، قطعه کد زیر اطلاعات درون فایل را تجزیه کرده و آنها را در خروجی چاپ خواهد کرد.
1package com.journaldev.java;
2
3import java.io.File;
4import java.io.IOException;
5import java.util.ArrayList;
6import java.util.List;
7import java.util.Scanner;
8
9public class ScannerExamples {
10
11 public static void main(String[] args) throws IOException {
12
13 // create scanner for the CSV file
14 Scanner sc = new Scanner(new File("employees.csv"));
15
16 // set delimiter as new line to read one line as a single token
17 sc.useDelimiter(System.getProperty("line.separator"));
18
19 // create the List of Employees
20 List<Employee> emps = new ArrayList<>();
21
22 while (sc.hasNext()) {
23 Employee emp = parseEmployeeData(sc.next());
24 emps.add(emp);
25 }
26
27 // close the scanner
28 sc.close();
29
30 // print employee records
31 System.out.println(emps);
32 }
33
34 private static Employee parseEmployeeData(String record) {
35 // create scanner for the String record
36 Scanner sc = new Scanner(record);
37
38 // set delimiter as comma
39 sc.useDelimiter(",");
40
41 Employee emp = new Employee();
42 emp.setId(sc.nextInt());
43 emp.setName(sc.next());
44 emp.setRole(sc.next());
45
46 // close the scanner
47 sc.close();
48
49 return emp;
50 }
51
52}
53
54class Employee {
55 private int id;
56 private String name;
57 private String role;
58
59 public int getId() {
60 return id;
61 }
62
63 public void setId(int id) {
64 this.id = id;
65 }
66
67 public String getName() {
68 return name;
69 }
70
71 public void setName(String name) {
72 this.name = name;
73 }
74
75 public String getRole() {
76 return role;
77 }
78
79 public void setRole(String role) {
80 this.role = role;
81 }
82
83 @Override
84 public String toString() {
85 return "Emp[" + id + "," + name + "," + role + "]";
86 }
87}
در نخستین گام یک شی از کلاس Scanner برای دریافت فایل با پسوند CSV و جدا کنندهای برای رفتن به خط جدید مشخص شده است. بدین ترتیب اطلاعات موجود در فایل خط به خط مورد بررسی قرار خواهند گرفت. سپس، با استفاده از یک شی جدید از کلاس Scanner و «کاما» (,) به عنوان جدا کننده هر خط از اطلاعات موجود در فایل تجزیه میشود. سپس، اطلاعات مربوط به هر خط درون شی مشخص شده ذخیره میشود و به لیست اضافه خواهد شد. در نهایت، اطلاعات درون لیست در خروجی چاپ میشود.
استفاده از Scanner همراه با عبارات منظم در جاوا برای پردازش اطلاعات
امکان ترکیب عبارتهای منظم با متدهای موجود در کلاس Scanner وجود دارد. به عنوان مثال، میتوان از این مورد برای پردازش اعداد صحیح درون یک رشته استفاده کرد. برای این منظور باید کلاس Scanner را در ترکیب با عبارت منظم مربوط به «کاراکترهای غیر رقمی» (non-digit) به عنوان جدا کننده به کار برد تا تنها اعداد صحیح از ورودی برای پردازش دریافت شوند. در ادامه قطعه کد مربوط به استفاده از Scanner همراه با عبارات منظم در جاوا برای پردازش اطلاعات ارائه شده است.
1//using regex to read only integers from a string source
2String data = "1a2b345c67d8,9#10";
3Scanner sc1 = new Scanner(data);
4
5// setting non-digit regex as delimiter
6sc1.useDelimiter("\\D");
7
8while(sc1.hasNext()) {
9 System.out.println(sc1.next());
10}
11
12// don't forget to close the scanner
13sc1.close();
خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
1 2 345 67 8 9 10
خواندن کاراکتر در جاوا
کلاس Scanner در جاوا متدهای مختلفی همچون nextInt() برای خواندن یک عدد صحیح، متد nextDouble() برای خواندن یک عدد اعشاری و متد nextLong() برای خواندن یک مقدار از نوع Long را دارد، اما متد جداگانهای برای خواندن کاراکتر در این کلاس وجود ندارد. برای همین منظور باید از ترکیب متد next() در کلاس Scanner و متد charAt() در کلاس String استفاده کرد.
![ذره بینی روی کببورد برای بررسی کدهد - خواندن کاراکتر در جاوا](https://blog.faradars.org/wp-content/uploads/2023/09/reading-characters-in-java-with-scanner-class-methods.jpg)
متد next() در کلاس Scanner در هر لحظه توکن بعدی ورودی را فارغ از نوع آن دریافت میکند. همچنین، متد charAt() کاراکتر موجود در «اندیس» (Index) مشخص شده را بر میگرداند. در یک دنباله کاراکتری اندیس مربوط به کاراکترها از مقدار 0 شروع میشود. نمونه کد زیر نحوه خواندن کاراکتر در جاوا به کمک کلاس Scanner را نشان میدهد.
1import java.util.Scanner;
2public class CharacterInputExample1
3{
4public static void main(String[] args)
5{
6Scanner sc = new Scanner(System.in);
7System.out.print("Input a character: ");
8// reading a character
9char c = sc.next().charAt(0);
10//prints the character
11System.out.println("You have entered "+c);
12}
13}
خروجی حاصل از نمونه کد بالا به صورت زیر خواهد بود.
Input a character: R You have entered R
بررسی متدهای کلاس Scanner در جاوا به همراه مثال
پیشتر در بخشهای قبلی این مطلب متدهای کلاس Scanner در جاوا مورد بررسی قرار گرفتند. در ادامه کاربرد تعدادی از متدهای کلاس Scanner به همراه مثال عملی مورد بررسی قرار خواهد گرفت.
متد nextInt در جاوا
از این متد در کلاس Scanner برای خواندن یک داده از نوع عدد صحیح استفاده میشود. در ادامه نمونه کد زیر کاربرد این متد را نشان میدهد.
1import java.util.Scanner;
2
3class Main {
4 public static void main(String[] args) {
5
6 // creates a Scanner object
7 Scanner input = new Scanner(System.in);
8
9 System.out.println("Enter an integer: ");
10
11 // reads an int value
12 int data1 = input.nextInt();
13
14 System.out.println("Using nextInt(): " + data1);
15
16 input.close();
17 }
18}
خروجی حاصل از اجرای کد بالا به صورت زیر خواهد بود.
Enter an integer: 22 Using nextInt(): 22
متد nextDouble در جاوا
از این متد در کلاس Scanner برای خواندن یک داده از نوع عدد اعشاری استفاده میشود. در ادامه نمونه کد زیر کاربرد این متد را نشان میدهد.
1import java.util.Scanner;
2
3class Main {
4 public static void main(String[] args) {
5
6 // creates an object of Scanner
7 Scanner input = new Scanner(System.in);
8 System.out.print("Enter Double value: ");
9
10 // reads the double value
11 double value = input.nextDouble();
12 System.out.println("Using nextDouble(): " + value);
13
14 input.close();
15 }
16}
خروجی حاصل از اجرای قطعه بالا به صورت زیر خواهد بود.
Enter Double value: 33.33 Using nextDouble(): 33.33
متد next در جاوا
متد next() برای خواندن یک رشته از ورودی مورد استفاده قرار میگیرد. در ادامه قطعه کد زیر کاربرد این متد را نشان میدهد.
1import java.util.Scanner;
2
3class Main {
4 public static void main(String[] args) {
5
6 // creates an object of Scanner
7 Scanner input = new Scanner(System.in);
8 System.out.print("Enter your name: ");
9
10 // reads the entire word
11 String value = input.next();
12 System.out.println("Using next(): " + value);
13
14 input.close();
15 }
16}
خروجی حاصل از اجرای نمونه کد بالا به صورت زیر خواهد بود.
Enter your name: Jonny Walker Using next(): Jonny
با بررسی خروجی نمونه کد بالا متوجه خواهید شد که با وجود وارد کردن نام کامل تنها بخش اول نام توسط ورودی دریافت شده است. دلیل این امر عملکرد متد next() است که خواندن رشته را تا رسیدن به «عبارت خالی» (Whitespace) ادامه میدهد. به عبارتی دیگر، این متد با رسیدن به عبارت خالی رشته دریافتی را تا همان قسمت برگشت میدهد.
متد nextLine در جاوا
این متد نیز برای خواندن رشته از ورودی مورد استفاده قرار میگیرد. در نمونه کد زیر کاربرد این متد نشان داده شده است.
1import java.util.Scanner;
2
3class Main {
4 public static void main(String[] args) {
5
6 // creates an object of Scanner
7 Scanner input = new Scanner(System.in);
8 System.out.print("Enter your name: ");
9
10 // reads the entire line
11 String value = input.nextLine();
12 System.out.println("Using nextLine(): " + value);
13
14 input.close();
15 }
16}
خروجی حاصل از اجرای نمونه کد بالا به صورت زیر خواهد بود.
Enter your name: Jonny Walker Using nextLine(): Jonny Walker
در این مثال هر دو قسمت مربوط به نام در خروجی چاپ میشود.
تفاوت next و nextLine در جاوا چیست؟
هر دو متد برای خواندن رشته از ورودی مورد استفاده قرار میگیرند، اما تفاوتهایی نیز با یکدیگر دارند. در واقع، متد next() تا رسیدن به کاراکتر خالی یا Whitespace به خواندن از ورودی ادامه میدهد. در نقطه مقابل اما متد nextLine() کاراکترهای خالی را نیز دریافت میکند و تا رسیدن به کاراکتر \n اطلاعات را از وروی میخواند. به بیان سادهتر این متد تا رسیدن به خط بعدی یا فشردن دکمه Enter به خواندن رشته ورودی ادامه میدهد.
مزایا و معایب کلاس Scanner در جاوا چیست؟
این کلاس نیز همانند هر کلاس دیگری در جاوا به توسعهدهندگان در امر توسعه کمک میکند. در ادامه مزایای استفاده از کلاس Scanner در جاوا فهرست شدهاند.
- برای شناسایی انتهای هر قطعه از داده میتوان از توکن منحصر به فردی استفاده کرد.
- امکان تجزیه دادههای خوانده شده توسط Scanner به نوعهای دادهای از پیش تعیین شده همچون int ، float ، short ، boolean و سایر موارد وجود دارد.
- امکان خواندن نوعهای دادهای اولیه و رشتهها با Scanner وجود دارد.
- کلاس Scanner گزینه بسیار مناسبی برای خواندن اطلاعات از فایل است.
- منطق کار با این کلاس بسیار آسان است.
در کنار نقاط قوت کلاس Scanner میتوان چند ایراد کوچک نیز از آن گرفت. برخی از نقاط ضعف این کلاس در ادامه آورده شده است.
- کلاس Scanner در جاوا ایمن نیست.
- دارای تنها «یک کیلوبایت» (1KB) حافظه بافر است.
- با توجه به سرعت پایین تجزیه جریانهای داده در کلاس Scanner، این کلاس قادر به پشتیبانی از ورودی و خروجیهای سریع در جاوا نیست.
- کلاس Scanner تنها در نسخه 1.5 یا بالاتر جاوا در دسترس قرار دارد.
سوالات متداول Scanner در جاوا
بعد از بررسی کامل کلاس Scanner در جاوا در این بخش به تعدادی از پرتکرارترین سوالات این حوزه پاسخ داده خواهد شد.
روشهای دریافت ورودی از کاربر در جاوا کدامند؟
دریافت ورودی از کاربر یکی از اولین کارهایی است که برنامهنویسان تازه کار یاد میگیرند. برای دریافت ورودی در جاوا علاوه بر کلاس Scanner روشهای دیگری نیز وجود دارد. در ادامه روشهای دریافت اطلاعات از ورودی در جاوا ارائه شده است.
- استفاده از شی کنسول در جاوا به صورت سراسری یا Global
- ساخت یک شی از کلاس Scanner در جاوا
- استفاده از عناصر رابط کاربری
- کار با System.in در جاوا برای دریافت جریان ورودی از داده
بهترین زمانی باید از Scanner در جاوا استفاده کرد؟
از کلاس Scanner در جاوا برای دریافت اطلاعات از کاربر و تجزیه آن به نوعهای دادهای اولیه همچون int ، double و String استفاده میشود. علاوه بر این، تجزیه اطلاعات به کمک عبارات منظم نیز از دیگر کاربردهای این کلاس است.
Scanner یا BufferReader کدامیک سریعتر است؟
از هر دو کلاس برای خواندن جریان ورودی اطلاعات استفاده میشود. کلاس BufferReader نسبت به Scanner سریعتر است، زیرا این کلاس تنها یک جریان ورودی از اطلاعات را میخواند. در نقطه مقابل، کلاس Scanner امکان دریافت اطلاعات به شکلهای مختلف را دارد.
آیا امکان ورودی گرفتن آرایه در جاوا به کمک کلاس Scanner وجود دارد؟
بله، امکان دریافت آرایه به عنوان ورودی توسط متدهای کلاس Scanner در جاوا وجود دارد. برای این منظور باید ابتدا طول آرایه را به دست آورد و سپس، به کمک یک حلقه تکرار مقادیر را از کاربر دریافت کرد.
جمعبندی
در دنیای توسعه نرمافزار هر اپلیکیشنی برای کارکرد صحیح نیاز به دریافت اطلاعات از کاربر دارد و این موضوع امری اجتناب ناپذیر است. بسیاری از وبسایتها و اپلیکیشنها برای ساخت حساب کاربری، تشخیص علاقهمندیهای کاربر و نمایش محتوای اختصاصی نیازمند دریافت برخی اطلاعات از سمت کاربر هستند. این مسئله در نرمافزارها و برنامههای تعاملیتر نظیر بازیهای ویدیویی از اهمیت بیشتری برخوردار است، زیرا به طور پیوسته باید اطلاعاتی از سمت کاربر به برنامه منتقل شود. بنابراین، آشنایی با نحوه و فرایند تعامل با کاربر و دریافت اطلاعات از اهمیت بالایی برخوردار است. در زبان برنامه نویسی جاوا کلاس Scanner مسئولیت برقراری ارتباط با کاربر را بر عهده دارد.
بر همین اساس در این مطلب از مجله فرادرس به این سوال پاسخ داده شد که Scanner در جاوا چیست و چه کاربردی دارد. همچنین، نحوه ایجاد شی از این کلاس و مراحل پیادهسازی آن توضیح داده شد. علاوه بر این، ضمن بیان نحوه کار کلاس Scanner در جاوا، متدهای مختلف موجود در آن به همراه مثال معرفی شدند.