JavaRush /وبلاگ جاوا /Random-FA /کلاس اسکنر در جاوا

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

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

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

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

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
ما یک شی اسکنر ایجاد کردیم و یک منبع داده برای آن تعیین کردیم (رشته ای با متن). این روش nextLine()به منبع داده (متن ما با رباعیات) دسترسی پیدا می کند، در آنجا خط بعدی را که هنوز نخوانده است (در مورد ما، اول) پیدا می کند و آن را برمی گرداند. پس از آن ما آن را به کنسول خروجی می دهیم: خروجی کنسول:

Люблю тебя, Peterа творенье,
می توانیم چندین بار از روش استفاده کنیم nextLine()و کل قطعه شعر را خروجی بگیریم:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       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);
   }
}
هر بار اسکنر ما یک قدم به جلو برمی‌دارد و خط بعدی را می‌خواند. نتیجه برنامه به کنسول خروجی می شود:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
همانطور که قبلاً گفتیم، منبع داده اسکنر می تواند نه تنها یک رشته، بلکه برای مثال، یک کنسول نیز باشد. خبر مهم برای ما: اگر قبلاً فقط داده ها را در آنجا خروجی می دادیم، اکنون داده ها را از صفحه کلید وارد می کنیم! بیایید ببینیم کلاس Scanner چه کارهای دیگری می تواند انجام دهد :
public class Main {

   public static void main(String[] args) {

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

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

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

   public static void main(String[] args) {

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

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
بیایید سعی کنیم رشته "JavaRush" را به جای عدد وارد کنیم: خروجی کنسول:
Enter the number:
JavaRush
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 the number:");

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

   }
}
اکنون برنامه ما بررسی می کند که آیا کاراکتر بعدی وارد شده یک عدد است یا خیر. و فقط در صورت وجود، یک تایید نمایش می دهد. اگر ورودی تست را قبول نکند، برنامه متوجه این موضوع می شود و از شما می خواهد که دوباره امتحان کنید. اساساً، می‌توانید با شی Scanner ارتباط برقرار کنید و از قبل بدانید که چه نوع داده‌ای را انتظار دارید. «هی، اسکنر، بعد چی؟ شماره، رشته یا چیز دیگری؟ عدد؟ و کدام یک - int،،، short؟ long" این انعطاف پذیری به شما این فرصت را می دهد که منطق برنامه خود را بسته به رفتار کاربر بسازید. روش مهم دیگری که ارزش توجه دارد این است useDelimiter(). این متد رشته ای را که می خواهید به عنوان جداکننده استفاده کنید ارسال می شود. مثلاً ناگهان به شعر ژاپنی علاقه مند شدیم و تصمیم گرفتیم با استفاده از اسکنر چندین هایکو از شاعر بزرگ ماتسو باشو را بخوانیم. حتی اگر سه آیه مختلف در یک خط ناشیانه به ما داده شود، می توانیم به راحتی آنها را از هم جدا کنیم و به زیبایی قالب بندی کنیم:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a Bare Branch" +
               "Raven sits alone.'" +
               "Autumn evening." +
               "''***''" +
               "There's such a moon in the sky,'" +
               "Like a tree cut down at the root:'" +
               "A fresh cut turns white." +
               "''***''" +
               "How the river has overflowed!" +
               "The heron wanders on short legs,'" +
               "Knee-deep in water.");

       scan.useDelimiter("'");

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

       scan.close();
   }
}
ما از متد useDelimeter() از کلاس Scanner به عنوان جداکننده خط استفاده می کنیم : این متد وظیفه تقسیم داده های دریافتی را به قطعات دارد. در مورد ما، یک نقل قول منفرد ( "'" ) به عنوان آرگومان ارسال می شود و برای جدا کردن رشته ها استفاده می شود . متن زیر این نقل قول در یک خط جدید ظاهر می شود زیرا در حلقه while از متد println() کلاس System برای خواندن داده ها استفاده می کنیم . در نتیجه، مانند کتاب ها، خروجی زیبایی در کنسول خواهیم داشت:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

*** 
 
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
در همین مثال یک روش دیگر وجود دارد که حتما باید به آن توجه کنید - close(). مانند هر شیئی که با جریان های ورودی/خروجی کار می کند، اسکنر باید پس از اتمام کار آن بسته شود تا دیگر منابع رایانه ما را مصرف نکند. هرگز روش را فراموش نکنید close()!
public class Main {

   public static void main(String[] args) {

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

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

       sc.close();//Now we did everything right!

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