معرفی کلاس اسکنر در زبان برنامه نویسی جاوا


در طراحی برنامه های کاربردی زمان های بسیاری برای ما پیش خواهد آمد که نیاز داریم تا کاربر بخشی از اطلاعات ورودی را از طریق صفحه کلید وارد برنامه کند تا بر اساس اطلاعات ورودی، برنامه طراحی شده نتیجه مرتبط را به کاربر اعلام کند.

برای این منظور می بایست با کلاس Scanner در زبان برنامه نویسی جاوا آشنا شویم. در حقیقت این کلاس در API زبان برنامه نویسی جاوا تعبیه شده است و ما صرفاً با Import کردن این کلاس و همچنین ساخت یک شیئ از روی آن، می توانیم از قابلیت های آن استفاده کنیم. برای روشن شدن این مطلب پروژه ی جدیدی در اکلیپس تحت عنوان ScannerIntro ایجاد می کنیم. سپس کلاسی تحت عنوان Project در آن ایجاد می کنیم (کلیه نام ها اختیاری می باشند.) در ابتدا برنامه ما می بایست به شکل زیر باشد:

class Project {
    public static void main(String[] args) {

    }
}

در حقیقت از آنجا که نیاز داریم تا برنامه ما یک نقطه شروع داشته باشد، همانطور که در جلسات گذشته توضیح داده شد& در حین ایجاد کلاس گزینه public static void main را تیک می زنیم. در این برنامه ما نیاز داریم تا این امکان را به کاربر خود بدهیم تا بتواند از طریق صفحه کلید اطلاعات را وارد برنامه کند، از اینرو کلاس Scanner را وارد برنامه خود می کنیم و نامی به دلخواه همچون myScanner برای آن در نظر می گیریم. به تصویر زیر توجه کنید:

محیط برنامه نویسی اکلیپس با قرار دادن نقطه چین دوره واژه های Scanner و همچنین قرار دادن یک علامت ستاره کنار نام فایل ما -همان طور که در تصویر فوق مشاهده می شود- به ما اخطار می دهد که مشکلی در برنامه وجود دارد. به منظور یافتن راه حل موس خود را روی علامت نقطه چین نگه می داریم و باکسی همچون تصویر زیر مشاهده خواهیم کرد:

در حقیقت محیط برنامه نویسی اکلیپس چندین پیشنهاد برای رفع مشکل به ما می دهد که ما نیاز داریم تا تک تک موارد پیشنهادی را مورد بررسی قرار دهیم. از آنجا که می بایست مد نظر داشته باشیم که هر وقت یک کلاس تعبیه شده در جاوا را در برنامه خود مورد استفاده قرار می دهیم حتما بایستی آنرا Import یا وارد برنامه خود کنیم، به راحتی اولین گزینه که Import Scanner به معنی کلاس اسکنر را وارد برنامه کن است را کلیک می کنیم. حال کدی به شکل زیر خواهیم داشت:

import java.util.Scanner;
class Project {
    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);
    }
}

(لازم به ذکر است که به جای Import کردن توسط محیط برنامه نویسی اکلیپس، می توانیم خودمان نیز کدهای Import مورد نیاز را به صورت دستی وارد برنامه کرده و یا پس از استفاده از یکی از کلاس های API جاوا همچون کلاس Scanner کلیدهای Ctrl و Shift و حرف O را به طور هم زمان فشار دهیم که با این کار فرآیند Import انجام خواهد شد.)

پس از Import کردن، همان طور که در کد فوق مشاهده می شود یک خط کد ;import java.util.Scanner به ابتدای سورس کد پروژه ی ما اضافه می شود. از این پس، بعد هر چند بار که نیاز داشته باشیم می توانیم بدون هیچ مشکلی از روی کلاس Scanner یک شیئ جدید ساخته و آن را مورد استفاده قرار دهیم (نحوه ساخت اشیاء در زبان جاوا به طور مفصل در آموزش های آتی مورد بررسی قرار خواهد گرفت.)

واژه ی Scanner نشانگر یک کلاس در زبان جاوا است که از پیش نوشته شده است و ما صرفاً آن را وارد برنامه خود می کنیم. واژه myScanner یک نام است به معنی کلاس اسکنر من که ما به صورت دلخواه برای نام شیئ ساخته شده از روی کلاس Scanner در نظر می گیریم. پس از علامت = با نوشتن کلید واژه ی new ما از اکلیپس می خواهیم که یک شیئ جدید از کلاس Scanner تحت عنوان myScanner برای ما ایجاد کند. حال پارامترهایی که داخل پرانتز قرار دارند عبارتند از کلید واژه System که حاکی از کلاسی است که این امکان را به جاوا می دهد که هرآنچه خارج از اختیار JVM بود وارد برنامه شود و کلید واژه in که موجب می گردد ورودی کامپیوتر یا لپ تاپ ما مورد استفاده این کلاس قرار گیرد که این ورودی همان صفحه کلید می باشد. حال می توانیم برنامه خود را تست کنیم. برای این منظور کد خود را به شکل زیر تکمیل می کنیم:

import java.util.Scanner;
class Project {
    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);
        System.out.println(myScanner.nextLine());
    }
}

در حقیقت با این دستور جدید که وارد برنامه خود کردیم، قصد داریم هر آنچه را که از طریق صفحه کلید وارد می کنیم برای ما مجدد نمایش داده شود. داخل دستور ;()System.out.println ما نام شیئ که از روی کلاس Scanner ایجاد کردیم را نوشته سپس متدی تحت عنوان ()nextLine ضمیمه آن می کنیم. به طور خلاصه کار این متد آن است که هر نوع ورودی از طریق صفحه کلید را وارد برنامه کند. حال اگر بخواهیم ورودی خاصی از صفحه کلید را مد نظر داشته باشیم بایستی از متد مخصوص همان داده ورودی استفاده کنیم.

متد ()nextLine حاکی از آن است که هر آنچه را وارد صفحه کلید کنیم به شکل یک string یا رشته در کنسول نمایش داده شود. برای مثال برنامه را اجرا کرده، سپس در بخش کنسول، نشانگر موس خود را مشاهده می کنیم که چشمک می زند به معنی این که می توانیم در آن چیزی وارد نماییم. جمله ای به دلخواه مثل My name is Behzad Moradi را وارد می کنیم سپس دکمه Enter را می زنیم و مشاهده می کنیم که دقیقاً همان چیزی را که از طریق صفحه کلید وارد برنامه کردیم را نمایش خواهد داد:

پس از آشنایی با یکی از کلاس های مفید در زبان برنامه نویسی جاوا، در قمست آتی خواهیم دید که چگونه می توان نوع ورودی داده را برای این کلاس از پیش تعیین کرد به طوری که کاربر فقط و فقط اجازه داشته باشد همان داده ای که از وی خواسته شده است را وارد برنامه کند.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمان
۱۳۹۶/۱۲/۱۶
سلام
باتشکر از اموزش های عالی
یه موردی که میشه اضافه بشه این هستش که صفحات اموزش شماره گذاری بشن
چون ممکنه یه زمانی اشتباها سایتو ببندیم و فرضا اواسط اموزش باشیم
اون موقع بجای اینکه روومثلا صفحه ۴۰بزنیم باید ۴۰بار دکمه نکست رو بزنیم
موفق باشید
muhamad64
muhamad64
۱۳۹۶/۱۲/۱۹
من که هر دفعه میگم خدا صاحب سایتو پدرشو بیامرزه سایته خوبیه
تیک مطالعه کردم را بزنید

در پاسخ به

hadimotamedi44
hadimotamedi44
۱۳۹۶/۰۹/۱۸
با سلام و خسته نباشید خدمت دوستان سکان آکادمی
ممنون از آموزشای عالیتون
کاربر میهمان
کاربر میهمان
۱۳۹۵/۱۱/۰۵
سلام من به صورت زیر انجام میدم ولی جواب نمیده میشه راهنمایی کنید
import java.util.Scanner;

public class Project {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.println(myScanner.nextLine(My name is Behzad Moradi:));
}

}
useramin47
useramin47
۱۳۹۶/۰۴/۳۱
نباید الان بنویسی my name is behzad moradi


عین این رو بنویس بعد run کن
بعد هر چی میخوای بنویس تو کنسول

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۵/۱۱/۰۵
import java.util.Scanner;

public class Project {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.println(myScanner.nextLine(My name is Behzad Moradi:));
}

}
کاربر میهمان
کاربر میهمان
۱۳۹۵/۱۱/۰۱
In computer science, a resource leak is a particular type of resource consumption by a computer program where the program does not release resources it has acquired. This condition is normally the result of a bug in a program.
در علوم رایانه ای، نشت منابع ، نمونه خاصی از استفاده منابع توسط برنامه های رایانه ای میباشد که برنامه، منابع بدست اورده رو ازاد نمیکنه! این وضعیت به طور معمول ناشی از وجود خطا در برنامه میباشد.
کاربر میهمان
کاربر میهمان
۱۳۹۵/۱۱/۰۱
Resource leak!! نشت منابع؟؟
یعنی چی؟
کاربر میهمان
کاربر میهمان
۱۳۹۵/۱۱/۰۱
سلام
علتش چیه که اکلیپس از ما میخواد ابجکت اسکنرو ببندیم؟
درحالی که برنامه درست اجرا میشه ؟
کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۹/۱۶
با سلام. در یک کلام.... آموزش ها واقعا عالیه. ممنون از شما.
همچنین جا داره تشکر کنم بابت استفاده از فونت بی نظیر IranSans
سید مصطفی
سید مصطفی
۱۳۹۵/۰۹/۰۸
چرا این دستور اسکنر در سیستم من کار نمی کنه و مشکل داره ؟ و وقتی در نت پد می نویسم و می خوااهم بایت کد کنم خطا میده ؟
مثلا برنامه ی ساده زیر رو خطا میده
import java.util.Scanner;
public class mesal3{
public static void main(String[] args)
{
Scanner n = new Scanner(System.in);
System.out.println(n.nextLine());
}
}
nahid
nahid
۱۳۹۵/۰۹/۰۶
در مورد فایل تمرین تا جاییکه من میدونم همون سورس کد آموزش هر بخش هست که میتونیم بعد از اکسترکت از داخل فولدر src ، فایل progect.java را وارد اکلیپس کنیم. شاید با مقایسه این تمرین با کدی که خودمون نوشتیم بتونیم رفع اشکال کنیم.
nahid
nahid
۱۳۹۵/۰۹/۰۶
سلام و خدا قوت...فایل تمرین همون سورس کد مثالهایی هست که خودتون توی آموزشها میزنید؟ ممکنه توضیح بدین؟ چجوری استفاده کنیم؟؟؟؟
Shayan
Shayan
۱۳۹۵/۰۹/۰۳
سلام.میخواستم بدونم چطور از فایل تمرین میشه استفاده کرد؟ ممنون
امین ناطق
امین ناطق
۱۳۹۵/۰۸/۱۹
سلام در ایجاد پروژه جدید مشکلی ندارم و گزینه Public static void main رو هم تیک میزنم و پروژه جدید رو ایجاد میکنم.در ایجاد کلاس هم مشکلی ندارم.
برنامه ای که در بالا نوشته شده رو هم بطور کامل مینویسم اما اجرا نمیشه و اما وقتی موس رو روی scanner نگه میدارم و از میان راهنمایی های ایکلیپس گزینه اول رو میزنم مجددا پنجره ایجاد کلاس باز میشه لطفا راهنمایی بفرمایید.
zahra_san
zahra_san
۱۳۹۵/۰۸/۰۸
سلام
من نمیدونم چطور باید فایل های تمرین رو باز کنم و استفاده کنم هیچ کدودم از فایل هایی که توی پوشه قرار داره برام باز نمیشه؟؟؟
میشه راهنماییم کنید...
کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۸/۰۵
من برنامه رو کاملا اجرا کردم و مشکلی نداشت ولی یک هشدار کنار خط چهار گذاشته به ابن عنوان:
resource leak : myScanner is never closed
مشکل چیه؟
hadimotamedi44
hadimotamedi44
۱۳۹۶/۰۹/۱۸
بعد از کامل کردن کردن برنامه بعد از خط 5 به صورت جداگانه و قبل از آکولادها
myScanner رو close کنید به این صورت
;()myScanner.close

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۸/۰۵
فایل تمرین را هم دانلود کردم ولی نمیدونم باید چیکارش کنم. میشه راهنمایی کنید لطفا؟
کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۵/۲۷
سلام؛
چرا فایل تمرین باز نمیشه؟
کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۴/۱۷
سلام خسته نباشید من وقتی اشاره گر موس رو روی myScanner میارم گزینه ایمپورت نمیاد ....
چیکار کنم؟؟؟؟؟؟!
محمد صالح
محمد صالح
۱۳۹۵/۰۵/۰۴
سلام
از کلیدهای ترکیبی ctrl+shift+o استفاده نمایید

در پاسخ به

aliireza
aliireza
۱۳۹۵/۰۴/۰۸
سلام من وقتی برنامه رو کامپایل میکنم هیچی نشون نمیده به عنوان مثال این سورس کد منه
;(Scanner myScanner = new Scanner(System.in)
;(()System.out.println(myScanner.nextLine)
که در خط کد اول زیر کلمه myScanner خط زرد کشیده که نمیدونم دلیلش چیه هر کاری کردم درست نشد.
کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۳/۳۱
این کار رو کردم ، ارور برطرف میشه ولی تو قسمت کنسول این پیام رو نمایش میده:
Exception in thread "main" java.lang.IllegalStateException: Scanner closed
at java.util.Scanner.ensureOpen(Unknown Source)
at java.util.Scanner.findWithinHorizon(Unknown Source)
at java.util.Scanner.nextLine(Unknown Source)
at Project.main(Project.java:8)
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۵/۰۴/۰۱
سلام. در آخرین خط برنامه (یعنی در خطی که بعد از اون نمی‌خواین از اسکنر استفاده کنید) از این متد استفاده کنید.

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۳/۳۰
سلام و خسته نباشید خدمت شما و تشکر از سایت خوب و همینطور آموزشهای عالی. من دقیقا همین مراحل رو طی کردم و دقیقا همین کد رو وارد کردم ولی وارنینگ میده که Resource leak : myScanner never closed.
ممنون میشم راهنماییم کنید.
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۵/۰۳/۳۱
سلام. آبجکت اسکنر و با استفاده از متد ()close ببندید.

در پاسخ به

mehran
mehran
۱۳۹۵/۰۳/۱۱
این تمرین عمل نمیکند. هیچ اتفاقی نمیافتد.در بخش کنسول نشانگر نمیآید.
محمد صالح
محمد صالح
۱۳۹۵/۰۵/۰۴
ابتدا خودتون با ماوس در کنسول کلیک کنید سپس ورودی خود را وارد نمایید

در پاسخ به

javad
javad
۱۳۹۵/۰۱/۲۹
باسلام،بسیار زیبا و لذت بخش،
ممنونم بابت همه چیز
mohammad m
mohammad m
۱۳۹۴/۱۲/۲۳
منظور از سورس کد و بایت کد چیه؟
با تشکر
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۴/۱۲/۲۳
سلام. سورس کد منظور کدی است که در فایل java. نوشته میشه. و بایت کد هم وقتی فایل java. رو کامپایل می‌کنید تولید میشه که پسوند بایت کد class. است.

در پاسخ به

mohammad m
mohammad m
۱۳۹۴/۱۲/۲۹
kheyli mamnon

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۴/۱۱/۲۱
سلام.یه سوال داشتم.چطور میشه با استفاده از متدclose آبجکت ایجاد شده از روی کلاس اسکنر رو بست؟کدش چه شکلی میشه؟
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۴/۱۱/۲۱
input.close();

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۴/۱۰/۲۵
با عرض سلام و تشکر به خاطر زحمات یک سوال داشتم که چرا کلاس String ایمپرت نمیکنیم اما Scanner باید ایمپورت شه و همچنین چرا پس از new در کد دوباره Scanner نوشتین؟!
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۴/۱۰/۲۶
سلام
در جاوا پکیجی هست به نام java.lang که به طور ضمنی توسط کامپایلر در همه کلاس های جاوا import میشه. بنابراین زمان استفاده از این کلاس ها مثل String, System, Math و ... که در این بسته قرار دارند، دیگه نیازی به ایمپورت اونها نیست.
در مورد کلمه کلیدی new موقعی استفاده میشه که ما می خوایم از روی کلاسی یک آبجکتی و ایجاد کنیم.

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۴/۱۰/۱۶
با معذرت API چیست؟
ادمین سایت
ادمین سایت
۱۳۹۴/۱۰/۱۶
با سلام
لطفا به لینک زیر مراجعه نمایید:
http://goo.gl/gAZPRA

با تشکر
ارادتمند
تیم سکان آکادمی

در پاسخ به

crow13
crow13
۱۳۹۴/۰۹/۲۶
سلام . فایل تمرینی رو دانلود کردم ولی بلد نیستم بازش کنم . میشه کمکم کنین ؟
کاربر میهمان
کاربر میهمان
۱۳۹۴/۰۹/۲۲
سلام.. شما گفتید که " با استفاده از متد close(); آبجکت ایجاد شده از روی کلاس اسکنر را ببندید. " .. میشه لطفا بیشتر توضیح بدید من همیشه این مشکل رو دارم
کاربر میهمان
کاربر میهمان
۱۳۹۴/۰۹/۲۲
سلام من میخواهم با cmd برنامه رو کامپایل کنم ولی این ارور ها رو میده:
Scanner.java:1: error: Scanner is already defined in this compilation unit
import java.util.Scanner;
^
Scanner.java:4: error: reference to Scanner is ambiguous
Scanner myScanner = new Scanner(System.in);
^
both class java.util.Scanner in java.util and class Scanner in unnamed package match
Scanner.java:4: error: reference to Scanner is ambiguous
Scanner myScanner = new Scanner(System.in);
^
both class java.util.Scanner in java.util and class Scanner in unnamed package match
3 errors
سید مصطفی
سید مصطفی
۱۳۹۵/۰۹/۰۸
این من هم همین مشکل رو داره اصلا با دستور اسکنر مشکل داره کسی هست راهنمایی کنه

در پاسخ به

محمد کشاورز
محمد کشاورز
۱۳۹۴/۰۹/۰۹
با سلام وتشکر. در فرمان شرطی if من میخواهم دو رشته string را مقایسه کنم. if(a=b) رشته a را خودم وارد برنامه کردم. ورشته b را با scanner وارد برنامه میکنیم.با فرمان scanner همان محتویات رشته a را وارد میکنم تا جاب if درست شود اما اینطور نمیشود. چرا جواب if غلط میشود? اما اگر هر دو رشته a و b را داخل برنامه وارد کنیم در صورتی که برابر باشند فرمان if درست می شود.
محمد صالح
محمد صالح
۱۳۹۵/۰۵/۰۴
با سلام و احترام
جهت مقایسه رشته ها بایستی از متد equals استفاده نمایید.
ملاحظه بفرمایید
http://stackoverflow.com/questions/38561983/why-my-program-doesnt-work-properly

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۴/۰۸/۲۷
سلام.. ارور میده. ازش عکس گرفتم لطفا بفرمایید مشکل از کجاست..؟؟
http://uupload.ir/files/x03j_error.png
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۴/۰۸/۲۷
سلام
با استفاده از متد close(); آبجکت ایجاد شده از روی کلاس اسکنر را ببندید.

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۴/۰۸/۲۳
import java.util.Scanner;


public class One {

public static void main(String[] args) {

Scanner name=new Scanner(System.in);

System.out.println(name.nextLine());

}

}
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۴/۰۸/۲۴
دوست عزیز برنامه شما از ریشه غلطه. داخل استریم خروجی، می خوای ورودی بگیری. شما اول ورودی و با اسکنر بگیر بعد چاپ کن.

در پاسخ به

mobiniqow
mobiniqow
۱۳۹۵/۰۳/۱۳
ولی این که مثال هستش!!! من نوشتم اجرا شده

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۴/۰۸/۲۲
برنامه این error رو میده و اجرا نمیشه

Multiple markers at this line
- Line breakpoint:Project [line: 11] -
main(String[])
؟؟؟؟؟
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۴/۰۸/۲۲
لطفا یه عکسی از کدتون قرار بدین.

در پاسخ به

محمد عقبائی فرهنگ
محمد عقبائی فرهنگ
۱۳۹۴/۰۸/۱۵
چرا در ایجاد شی string از کلمه کلیدی new استفاده نکردیم؟ ولی برای ایجاد شی scanner از کلمه کلیدی new استفاده کردیم؟
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۴/۰۸/۱۵
سلام
اگر ما بخوایم یه آبجکتی و ایجاد کنیم، از کلمه کلیدی new استفاده می کنیم. در غیر این صورت اون آبجکت فقط تعریف شده، ایجاد نشده.

در پاسخ به

محمد عقبائی فرهنگ
محمد عقبائی فرهنگ
۱۳۹۴/۰۸/۱۵
یعنی اون object از قبل تعریف شده بوده؟ برا همین new ننوشتیم؟

در پاسخ به

Sina Deuxshiri
Sina Deuxshiri
۱۳۹۴/۰۸/۱۶
نه. وقتی می نویسیم: String name; یه آبجکتی و تعریف می کنیم. اگر هم جلوش مساوی و بعد هم از new استفاده کنیم، اون آبجکت ایجاد میشه.

در پاسخ به

محمد
محمد
۱۳۹۴/۰۸/۱۱
JVM چیست؟
ادمین سایت
ادمین سایت
۱۳۹۴/۰۸/۱۲
مخفف Java Virtual Machine یا ماشین مجازی جاوا است. وظیفه ی این ماشین تبدیل سورس کد جاوا به بایت کد است.

در پاسخ به