CodeGym /وبلاگ جاوا /Random-FA /کلاس اسکنر جاوا
John Squirrels
مرحله
San Francisco

کلاس اسکنر جاوا

در گروه منتشر شد
سلام! درس امروز ما ویژه خواهد بود! در درس امروز، ما در مورد کلاس جاوا اسکنر صحبت خواهیم کرد. قبلاً، فرآیند تکمیل وظایف و نوشتن برنامه‌ها ساده بود: ما مقداری کد می‌نویسیم، متد main() را اجرا می‌کنیم ، برنامه آنچه را که لازم است انجام می‌دهد و کار ما تمام می‌شود. اما اکنون همه چیز تغییر خواهد کرد! امروز می آموزیم که چگونه واقعاً با برنامه تعامل داشته باشیم: به آن آموزش خواهیم داد که چگونه به اعمال ما پاسخ دهد! قبل از شروع تجزیه و تحلیل کد، آیا تا به حال مجبور شده اید با دستگاهی مانند اسکنر سروکار داشته باشید؟ شاید. داخل یک اسکنر کاملاً پیچیده است، اما ایده اصلی نحوه عملکرد آن بسیار ساده است: داده هایی را که کاربر ارائه می دهد (مانند گذرنامه یا بیمه نامه) می خواند و این اطلاعات را در حافظه ذخیره می کند (مثلاً به عنوان تصویر). ). امروز می خواهید اسکنر خود را بسازید! البته از پس مدارک کاغذی برنمیاد ولی متن مشکلی نداره :) بریم!

کلاس اسکنر جاوا

کلاس اسکنر - 1قبل از هر چیز باید با کلاس java.util.Scanner آشنا شویم . عملکرد آن بسیار ساده است. مانند یک اسکنر واقعی، داده ها را از منبعی که شما مشخص کرده اید می خواند. به عنوان مثال، یک رشته، یک فایل، کنسول. در مرحله بعد، اطلاعات را می شناسد و به درستی پردازش می کند. در اینجا ساده ترین مثال است:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
ما یک شی اسکنر ایجاد کرده ایم و منبع داده آن (رشته ای از متن) را مشخص کرده ایم. متد nextLine () به منبع داده (متن ما با یک رباعی) دسترسی پیدا می کند، خط خوانده نشده بعدی (که در این مورد خط اول است) را پیدا می کند و آن را برمی گرداند. سپس آن را در کنسول نمایش می دهیم: خروجی کنسول:

It matters not how strait the gate,
می توانیم چندین بار از متد nextLine() استفاده کنیم و کل گزیده شعر را نمایش دهیم:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
هر بار، اسکنر ما یک قدم به جلو می رود و خط بعدی را می خواند. خروجی برنامه نمایش داده می شود:

It matters not how strait the gate, 
How charged with punishments the scroll, 
I am the master of my fate, 
I am the captain of my soul
همانطور که قبلاً گفتیم، منبع داده اسکنر نباید یک رشته باشد. به عنوان مثال، این می تواند کنسول باشد. چند خبر هیجان انگیز برای شما: قبلاً داده ها را در آنجا نمایش می دادیم، اما اکنون داده ها را از صفحه کلید می خوانیم! بیایید ببینیم کلاس Scanner چه کارهای دیگری انجام می دهد:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
متد nextInt() عدد وارد شده را می خواند و برمی گرداند. در برنامه ما از آن برای اختصاص مقداری به متغیر شماره استفاده می کنیم . در حال حاضر بیشتر شبیه یک اسکنر واقعی است! برنامه از کاربر می خواهد که هر عددی را وارد کند. بعد از اینکه کاربر این کار را انجام داد، برنامه از کاربر تشکر می کند، نتیجه را نمایش می دهد و کار را تمام می کند. اما ما هنوز یک مشکل جدی داریم. ممکن است کاربر اشتباه کند و اشتباهی وارد کند. در اینجا یک مثال است که در آن برنامه فعلی ما کار نمی کند:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
بیایید سعی کنیم رشته "CodeGym" را به جای یک عدد وارد کنیم: خروجی کنسول:
Enter a number:
CodeGym 
Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Scanner.java:864) 
at java.util.Scanner.next(Scanner.java:1485) 
at java.util.Scanner.nextInt(Scanner.java:2117) 
at java.util.Scanner.nextInt(Scanner.java:2076) 
at Main.main(Main.java:10) Process finished with exit code 1
اوه، اوه ما در دردسر بزرگی هستیم -_- برای جلوگیری از چنین شرایطی، باید راهی برای تأیید اطلاعات وارد شده توسط کاربر ارائه کنیم. به عنوان مثال، اگر کاربر چیزی غیر از عدد وارد کند، خوب است هشداری مبنی بر عدد نبودن اطلاعات وارد شده نمایش داده شود. و اگر اطلاعات درست باشد، می توانیم تایید کنیم. اما این مستلزم این است که ما «به آینده نگاه کنیم» تا ببینیم چه چیزی در جریان ما می آید. آیا اسکنر می تواند این کار را انجام دهد؟ و چطور! و متدهای زیادی برای انجام این کار دارد: hasNextInt() - این روش بررسی می‌کند که آیا تکه بعدی داده‌های ورودی یک عدد است (در صورت لزوم درست یا نادرست را برمی‌گرداند). hasNextLine() - این روش بررسی می کند که آیا قطعه بعدی ورودی یک رشته است یا خیر. hasNextByte() ، hasNextShort() ، hasNextLong() ، hasNextFloat() ، hasNextDouble() - همه این روش ها بررسی های مشابهی را برای انواع داده های باقی مانده انجام می دهند. بیایید سعی کنیم برنامه اعدادخوانی خود را تغییر دهیم:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thanks! You entered the number " + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
اکنون برنامه ما بررسی می کند که آیا کاراکتر بعدی وارد شده یک عدد است یا خیر. و فقط در صورت وجود تاییدیه را نمایش می دهد. اگر ورودی بررسی نشود، برنامه یادداشت می‌کند و از کاربر می‌خواهد دوباره امتحان کند. اساساً می توانید با شی Scanner ارتباط برقرار کنید و از قبل بفهمید چه نوع داده ای در انتظار شماست. یک عدد، رشته یا چیز دیگری؟ یک عدد؟ و چه نوع؟ یک int ، کوتاه ، طولانی ؟» این انعطاف‌پذیری به شما این فرصت را می‌دهد که منطق برنامه‌ای را بسازید که به رفتار کاربر بستگی دارد. ما باید روش مهم دیگری را یادداشت کنیم: useDelimiter() . شما یک رشته را به این متد ارسال می‌کنید. رشته شامل کاراکترهایی که می خواهید به عنوان جداکننده یا جداکننده از آنها استفاده کنید. برای مثال، فرض کنید ما ناگهان به شعر ژاپنی علاقه مند شدیم و تصمیم گرفتیم از اسکنر خود برای خواندن تعدادی هایکو نوشته شاعر بزرگ ماتسو باشو استفاده کنیم. حتی اگر سه بیت مختلف به ما منتقل شود. یک رشته ناخوشایند، ما به راحتی می توانیم آنها را تقسیم کنیم و آنها را به زیبایی رندر کنیم:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a withered branch'" +
               "A crow has alighted.'" +
               "Nightfall in autumn." +
               "''***''" +
               "Such a moon above,'" +
               "Like a tree cut at the root:'" +
               "he fresh cut is white." +
               "''***''" +
               "How the river floods!'" +
               "A heron wanders on short legs,'" +
               "Knee-deep in the water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
ما از "\ n /*/*/*" (نویسه خط جدید و سه ستاره) به عنوان جداکننده استفاده می کنیم. در نتیجه، ما خروجی کنسول زیبایی داریم، درست مانند کتاب ها:
On a withered branch 
A crow has alighted. 
Nightfall in autumn. 

*** 

Such a moon above, 
Like a tree cut at the root: 
The fresh cut is white. 

*** 

How the river floods! 
A heron wanders on short legs, 
Knee-deep in the water.
این مثال یک روش دیگر دارد که باید به طور کامل به آن اشاره کنیم: close() . مانند هر شیئی که با جریانهای ورودی/خروجی کار می کند، اسکنر پس از اتمام کار باید بسته شود تا از مصرف منابع کامپیوتر خودداری کند. هرگز متد close() را فراموش نکنید !
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

       sc.close(); // Now we've done everything right!

   }
}
خودشه! همانطور که می بینید، استفاده از کلاس Scanner بسیار آسان است! :) برای تقویت آموخته هایتان، پیشنهاد می کنیم یک درس ویدیویی از دوره جاوا ما تماشا کنید
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION