CodeGym /จาวาบล็อก /สุ่ม /จาวาสแกนเนอร์คลาส
John Squirrels
ระดับ
San Francisco

จาวาสแกนเนอร์คลาส

เผยแพร่ในกลุ่ม
สวัสดี! บทเรียนของเราในวันนี้จะพิเศษ! ในบทเรียนวันนี้ เราจะพูดถึง Java Scanner Class ก่อนหน้านี้ กระบวนการทำงานให้เสร็จและเขียนโปรแกรมนั้นง่ายมาก เราเขียนโค้ด เรียกใช้main()วิธีการ โปรแกรมทำสิ่งที่จำเป็น และเราก็ทำเสร็จแล้ว แต่ตอนนี้ทุกอย่างจะเปลี่ยนไป! วันนี้เราจะเรียนรู้วิธีโต้ตอบกับโปรแกรมจริงๆ เราจะสอนวิธีตอบสนองต่อการกระทำของเรา! ก่อนที่เราจะเริ่มวิเคราะห์โค้ด คุณเคยต้องจัดการกับอุปกรณ์เช่นสแกนเนอร์หรือไม่? อาจจะ. ด้านในของสแกนเนอร์ค่อนข้างซับซ้อน แต่แนวคิดพื้นฐานเกี่ยวกับวิธีการทำงานนั้นง่ายมาก: จะอ่านข้อมูลที่ผู้ใช้ให้ไว้ (เช่น หนังสือเดินทางหรือกรมธรรม์ประกันภัย) และเก็บข้อมูลนี้ไว้ในหน่วยความจำ (เช่น เป็นรูปภาพ ). วันนี้คุณกำลังจะสร้างสแกนเนอร์ของคุณเอง! แน่นอนว่ามันไม่สามารถจัดการกับเอกสารที่เป็นกระดาษได้ แต่ข้อความจะไม่ใช่ปัญหาสำหรับมัน :) ไปกันเถอะ!

คลาสสแกนเนอร์ของ Java

คลาสสแกนเนอร์ - 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()เข้าถึงแหล่งข้อมูล (ข้อความของเราที่มีเครื่องหมาย quatrain) ค้นหาบรรทัดถัดไปที่ยังไม่อ่าน (ซึ่งเป็นบรรทัดแรกในกรณีนี้) และส่งกลับ จากนั้นเราจะแสดงบนคอนโซล: เอาต์พุตของคอนโซล:

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 , short , long ?" ความยืดหยุ่นนี้เปิดโอกาสให้คุณสร้างตรรกะของโปรแกรมที่ขึ้นอยู่กับพฤติกรรมของผู้ใช้ เรา ควรจด method ที่สำคัญอีกวิธีหนึ่ง: 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 () เช่นเดียวกับอ็อบเจกต์อื่นๆ ที่ทำงานกับสตรีม I/O เมื่อเสร็จสิ้นการสแกนจะต้องปิดเครื่องสแกน เพื่อให้หยุดการใช้ทรัพยากรของคอมพิวเตอร์ อย่าลืม วิธี การปิด () !

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นั้นใช้งานง่ายมาก! :) เพื่อเสริมสิ่งที่คุณได้เรียนรู้ เราขอแนะนำให้คุณดูบทเรียนวิดีโอจากหลักสูตร Java ของเรา

อ่านเพิ่มเติม:

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION