در این مقاله با شیوه استفاده از کلاس اسکنر جاوا برای خواندن ورودی‌ها جهت یافتن و رد کردن الگوها با جداکننده‌های مختلف آشنا می‌شویم.

اسکن کردن یک فایل

ابتدا به بررسی شیوه خواندن یک فایل می‌پردازیم. در مثال زیر یک فایل را که شامل عبارت Hello world است در توکن‌ها می‌خوانیم:

در کد فوق به شیوه استفاده از متد ()next برای بازگشت دادن توکن String بعدی توجه کنید. ضمناً به شیوه بستن اسکنر در زمانی که کار ما با آن به پایان می‌رسد توجه کنید.

تبدیل InputStream به رشته

در این بخش شیوه تبدیل یک InputStream به یک رشته جاوا را با استفاده از یک Scanner بررسی می‌کنیم:

همانند مثال قبل در اینجا نیز از Scanner برای توکن‌دار کردن کل استریم از آغاز تا ریجکس A بعدی که با ورودی کامل انطباق می‌یابد، استفاده کرده‌ایم.

تفاوت اسکنر با BufferedReader

اکنون به بررسی تفاوت بین اسکنر با BufferedReader می‌پردازیم. به طور کلی:

  • از BufferedReader زمانی استفاده می‌کنیم که بخواهیم ورودی را درون خط‌ها قرار دهیم.
  • از اسکنر زمانی استفاده می‌کنیم که ورودی را در توکن‌ها قرار دهیم.

در مثال زیر یک فایل را با استفاده از BufferedReader در خط قرار می‌دهیم.

در مثال زیر با استفاده از Scanner همان فایل را درون توکن‌ها قرار می‌دهیم:

در کد فوق به شیوه استفاده از API اسکنر به نام ()nextLine برای خواندن کل خط توجه کنید.

اسکن ورودی از کنسول با اسکنر جدید System.in

در این بخش به بررسی شیوه خواندن ورودی از کنسول با استفاده از نمونه‌ای از اسکنر می‌پردازیم. به مثال زیر توجه کنید:

توجه کنید که ما از (…)System.setIn برای شبیه‌سازی برخی ورودی‌ها از کنسول استفاده کرده‌ایم.

API به نام ()nextLine

این متد صرفاً رشته‌ای که در خط جاری قرار دهد را بازمی‌گرداند:

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

API به نام ()nextInt

این متد توکن بعدی را از ورودی به صورت یک int اسکن می‌کند:

این API توکن عدد صحیح ممکن بعدی را می‌خواند. در این مورد اگر توکن بعدی یک عدد صحیح باشد و پس از آن یک جداکننده قرار داشته باشد، ()nextInt جداکننده خط را مصرف نخواهد کرد. به جای آن، موقعیت اسکنر روی خود جداکننده خط قرار می‌گیرد. بنابراین اگر یک سری از عملیات داشته باشیم که عملیات نخست به صورت ()scanner.nextInt و پس از آن به صورت ()scanner.nextLine باشد، و به عنوان ورودی یک عدد صحیح ارائه کنیم، هر دو عملیات اجرا خواهند شد. nextInt() API عدد صحیح را مصرف می‌کند و nextLine() API جداکننده خط را مصرف می‌کند و اسکنر را در آغاز خط بعدی قرار می‌دهد.

اعتبارسنجی ورودی

اکنون به بررسی شیوه اعتبارسنجی ورودی با استفاده از اسکنر می‌پردازیم. در مثال زیر از متد ()hasNextInt در Scanner برای بررسی این که ورودی عددی صحیح است یا نه، استفاده می‌کنیم:

اسکن یک رشته

در این بخش به بررسی شیوه اسکن یک رشته با استفاده از Scanner می‌پردازیم:

نکته: متد nextInt(16)، توکن بعدی را به صورت یک مقدار صحیح هگزادسیمال می‌خواند.

یافتن الگو

اینک به بررسی شیوه یافتن یک الگو با استفاده از اسکنر می‌پردازیم. در مثال زیر، از ()findInLine برای یافتن یک توکن در کل ورودی که با الگوی ارائه شده مطابقت داشته باشد، استفاده می‌کنیم:

همچنین می‌توانیم با استفاده از ()findWithinHorizon مانند مثال زیر، به دنبال الگو در یک دامنه خاص باشیم:

توجه کنید که افق جستجو صرفاً تعداد کاراکترهایی است که جستجو درون آن اجرا می‌شود.

رد کردن الگو

در این بخش با شیوه رد کردن یک الگو در اسکنر آشنا می‌شویم. ما می‌توانیم در زمان خواندن ورودی با استفاده از Scanner از توکن‌هایی که با الگوی خاصی مطابقت دارند، رد شویم. در مثال زیر، از توکن Hello با استفاده از متد ()skip در اسکنر رد می‌شویم:

تغییر جدا کننده اسکنر

در نهایت به بررسی شیوه تغییر «جداکننده» (Delimiter) در اسکنر می‌پردازیم. در مثال زیر جداکننده پیش‌فرض را به “o” عوض می‌کنیم:

همچنین می‌توانیم از چندین جداکننده استفاده کنیم. در مثال زیر از هر دو جداکننده کاما “,” و خط تیره “-“ برای اسکن کردن محتوای یک فایل که شامل عبارت John,Adam-Tom است، استفاده می‌کنیم:

نکته: جداکننده پیش‌فرض اسکنر کاراکتر فاصله (whitespace) است.

سخن پایانی

در این راهنما به بررسی چندین مثال واقعی از کاربردهای اسکنر جاوا پرداختیم. بدین ترتیب با شیوه خواندن ورودی از فایل، کنسول و یا رشته با استفاده از اسکنر آشنا شدیم. همچنین شیوه یافتن و رد کردن الگوهای خاص را با استفاده از اسکنر مشاهده کردیم و در نهایت روش تغییر جداکننده را در اسکنر آموختیم. کدهای کامل این مقاله را می‌توانید در این رپیوی گیت‌هاب (+) ملاحظه کنید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

میثم لطفی (+)

«میثم لطفی» دانش‌آموخته ریاضیات و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار نیز با مجله فرادرس همکاری دارد.

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *