1. การอ่านจากคอนโซลโดยใช้System.in

ในบทเรียนก่อนหน้านี้ เราได้ทำความคุ้นเคยกับคำสั่งสำหรับการแสดงข้อมูลบนหน้าจอ ในการทำเช่นนี้ เราได้ใช้ อ็อบเจกต์ และเมธอดSystem.outของมัน มันง่ายและสะดวกprint()println()

แต่อย่างที่คุณเดาได้อยู่แล้ว การแสดงข้อมูลบนหน้าจอนั้นไม่เพียงพอสำหรับเรา จุดประสงค์ของโปรแกรมส่วนใหญ่คือทำสิ่งที่มีประโยชน์สำหรับผู้ใช้ ซึ่งหมายความว่าผู้ใช้จำเป็นต้องป้อนข้อมูลจากแป้นพิมพ์บ่อยครั้งมาก

เช่นเดียวกับในกรณีของเอาต์พุต เรายังมีวัตถุพิเศษสำหรับการป้อนข้อมูลSystem.in— แต่น่าเสียดายสำหรับเรา ไม่สะดวกเท่าที่เราต้องการ มันให้เราอ่านข้อมูลจากคีย์บอร์ดทีละตัวอักษร

เพื่อปรับปรุงสิ่งนี้ เราจะใช้คลาสอื่นที่เมื่อจับคู่กับวัตถุSystem.inจะให้ทุกสิ่งที่เราต้องการ เป็นเวลานานแล้วที่ Java มีคลาสที่เหมาะกับทุกโอกาส และเราจะทำความรู้จักกับหนึ่งในนั้น


2. Scannerชั้นเรียน

คลาสScanner(ชื่อเต็ม: java.util.Scanner) สามารถอ่านข้อมูลจากแหล่งต่างๆ เช่น คอนโซล ไฟล์ และอินเทอร์เน็ต หากเราต้องการให้อ่านข้อมูลจากแป้นพิมพ์ เราจะต้องส่งวัตถุเป็นSystem.inอาร์กิวเมนต์ที่จะทำหน้าที่เป็นแหล่งข้อมูล จากนั้นวัตถุเครื่องสแกนเนอร์จะเข้าใจว่าจะทำอย่างไรกับมัน

การอ่านจากแป้นพิมพ์โดยใช้Scannerวัตถุจะมีลักษณะดังนี้:

รหัส คำอธิบาย
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
เราสร้างScannerวัตถุ
เราอ่านข้อความหนึ่งบรรทัดจากแป้นพิมพ์
เราอ่านตัวเลขจากแป้นพิมพ์

ดูเหมือนง่าย แต่มันง่ายขนาดนั้นจริงหรือ?

ฉันคิดว่าคุณต้องมีคำถามมากมาย และตอนนี้เราจะตอบคำถามเหล่านั้น

แต่ก่อนอื่น เรามาสาธิตตัวอย่างโปรแกรมที่สมบูรณ์ที่ใช้Scannerคลาส:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      String name = console.nextLine();
      int age = console.nextInt();

      System.out.println("Name: " + name);
      System.out.println("Age: " + age);
   }
}

3. การสร้างScannerวัตถุ

คำถามแรกคือบรรทัดนี้คืออะไรScanner console = new Scanner (System.in);?

บรรทัดนี้อาจทำให้สับสน แต่คุณจะเห็นสิ่งที่คล้ายกันตลอดเวลา ดังนั้นเราจึงคิดว่าเป็นเรื่องสำคัญที่จะต้องอธิบายว่าเกิดอะไรขึ้นที่นี่

จำวิธีที่เราสร้างตัวแปรด้วยข้อความ:

String str = "text";
การประกาศและเริ่มต้นตัวแปรสตริง

ขั้นแรก เราเขียนประเภทของตัวแปร ( String) ตามด้วยชื่อ ( str) และสุดท้าย หลังจากเครื่องหมายเท่ากับ เราเขียนค่า

บรรทัดที่ทำให้สับสนของเราเหมือนกัน:

Scanner console = new Scanner(System.in);
การประกาศและเริ่มต้นScannerตัวแปร

ทุกอย่างทางซ้ายของเครื่องหมายเท่ากับคือการประกาศตัวแปรconsoleที่มีประเภทScannerเป็น คุณสามารถเรียกมันs ว่า หรือscannerหรือkeyboardแม้แต่ จากนั้นรหัสจะมีลักษณะดังนี้:

Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();

ฉันคิดว่านั่นทำให้ทุกอย่างชัดเจนขึ้นมาก

แต่รหัสทางด้านขวาของเครื่องหมายเท่ากับนั้นซับซ้อนกว่าเล็กน้อย ตอนนี้ฉันหมายถึงnew Scanner(System.in); ที่กล่าวว่าไม่มีอะไรเหนือธรรมชาติเกิดขึ้นที่นี่เช่นกัน

ในรหัสนี้ เราบอกเครื่อง Java: สร้างวัตถุใหม่ ( newคำหลัก) ซึ่งมีประเภทคือScanner ส่งผ่านSystem.inวัตถุเป็นแหล่งข้อมูลสำหรับScannerวัตถุ ที่สร้างขึ้นใหม่

หลังจากดำเนินการทั้งบรรทัดนี้แล้ว เราจะมีScannerชื่อตัวแปรconsole ที่โปรแกรมของเราจะใช้เพื่ออ่านข้อมูลจากแป้นพิมพ์


4. รายการวิธีการ

ในตัวอย่างข้างต้นScanner consoleตัวแปรของเราจัดเก็บการอ้างอิงไปยังScannerวัตถุ

ในการเรียกใช้เมธอดบนวัตถุที่อ้างอิงโดยตัวแปร คุณต้องเขียนจุดหลังชื่อตัวแปร ตามด้วยชื่อเมธอดและอาร์กิวเมนต์ใดๆ ลักษณะทั่วไปของคำสั่งมีดังนี้:

variable.method(arguments);
การเรียกใช้เมธอดบนวัตถุที่อ้างอิงโดยตัวแปร

ตัวอย่าง:

System.out.println("Hello");
System.out.println(1);

หากคุณไม่ได้วางแผนที่จะส่งอาร์กิวเมนต์ไปยังฟังก์ชัน คุณก็แค่เขียนวงเล็บว่าง:

variable.method();
เรียกใช้เมธอดโดยไม่ผ่านการโต้แย้ง

ตัวอย่าง:

System.out.println();

5. อินพุตคอนโซล

เมื่อเรามีScannerวัตถุ การรับข้อมูลจากแป้นพิมพ์ทำได้ง่าย

หากต้องการอ่านบรรทัดจากแป้นพิมพ์คุณต้องใช้คำสั่งนี้:

String str = console.nextLine();

เมื่อการทำงานของโปรแกรมมาถึงบรรทัดนี้ มันจะหยุดชั่วคราวและรอให้ผู้ใช้ป้อนข้อมูลและกด Enter strจากนั้นทุกอย่างที่ผู้ ใช้ป้อนจะถูกเก็บไว้ในตัวแปร

หากต้องการอ่านตัวเลขจากแป้นพิมพ์คุณต้องใช้คำสั่งนี้:

int number = console.nextInt();

ทุกอย่างที่นี่เป็นเหมือนคำสั่งก่อนหน้า เมื่อการทำงานของโปรแกรมมาถึงบรรทัดนี้ มันจะหยุดชั่วคราวและรอให้ผู้ใช้ป้อนข้อมูลและกด Enter หลังจากนั้น ทุกสิ่งที่ผู้ใช้ป้อนจะถูกแปลงเป็นตัวเลขและจัดเก็บไว้ในnumberตัวแปร

หากผู้ใช้ป้อนข้อมูลที่ไม่สามารถแปลงเป็นจำนวนเต็มได้ โปรแกรมจะเกิดข้อผิดพลาดและออก

หากต้องการอ่านตัวเลขที่เป็นเศษส่วนจากแป้นพิมพ์คุณต้องใช้คำสั่งนี้:

double number = console.nextDouble();

คำสั่งนี้คล้ายกับคำสั่งที่ใช้nextInt()เมธอดมาก เพียงแต่ตรวจสอบว่าข้อมูลที่ป้อนสามารถแปลงเป็นdoubleตัวเลขได้

ตัวอย่างของโปรแกรมที่อ่านตัวเลขสองตัวจากแป้นพิมพ์และแสดงผลรวมบนหน้าจอ:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      int a = console.nextInt();
      int b = console.nextInt();

      System.out.println(a + b);
   }
}
บันทึก

ผู้ใช้สามารถป้อนตัวเลขหลายตัวในบรรทัดเดียวโดยคั่นด้วยช่องว่าง: วิธีการของคลาสScannerรู้วิธีจัดการสิ่งนี้ กล่าวคือ โปรแกรมจะอ่านตัวเลขหลังจากที่ผู้ใช้กดEnterเท่านั้น



6. วิธีการอื่นของScannerชั้นเรียน

อย่างไรก็ตาม วิธีการข้างต้นไม่ใช่ทั้งหมดที่Scannerชั้นเรียนมีให้ รายการเมธอดทั้งหมดมีลักษณะดังนี้:

วิธี คำอธิบาย
nextByte()
อ่านข้อมูลและแปลงเป็นbyte
nextShort()
อ่านข้อมูลและแปลงเป็นshort
nextInt()
อ่านข้อมูลและแปลงเป็นint
nextLong()
อ่านข้อมูลและแปลงเป็นlong
nextFloat()
อ่านข้อมูลและแปลงเป็นfloat
nextDouble()
อ่านข้อมูลและแปลงเป็นdouble
nextBoolean()
อ่านข้อมูลและแปลงเป็นboolean
next()
อ่านหนึ่ง "โทเค็น" โทเค็นจะถูกคั่นด้วยช่องว่างหรือการกดปุ่ม Enter
nextLine()
อ่านทั้งบรรทัด

นอกจากนี้ยังมีวิธีการที่ให้คุณตรวจสอบโทเค็นถัดไปในอินพุตโดยไม่ต้องดึงข้อมูลจริง (เพื่อให้รู้ว่าจะใช้วิธีใดในการอ่าน)

วิธี คำอธิบาย
hasNextByte()
มีbyte? อินพุตสามารถแปลงเป็นbyte?
hasNextShort()
มีshort? อินพุตสามารถแปลงเป็นshort?
hasNextInt()
มีint? อินพุตสามารถแปลงเป็นint?
hasNextLong()
มีlong? อินพุตสามารถแปลงเป็นlong?
hasNextFloat()
มีfloat? อินพุตสามารถแปลงเป็นfloat?
hasNextDouble()
มีdouble? อินพุตสามารถแปลงเป็นdouble?
hasNextBoolean()
มีboolean? อินพุตสามารถแปลงเป็นboolean?
hasNext()
มีโทเค็นอื่นหรือไม่?
hasNextLine()
มีแนวอื่นอีกไหม

7. การอ่านข้อมูลจากสตริง

ก่อนหน้านี้เราได้กล่าวไว้ว่าScannerคลาสสามารถอ่านข้อมูลจากแหล่งต่างๆ หนึ่งในแหล่งที่มาเหล่านั้นคือสตริงข้อความ

ดูเหมือนว่า:

String str = "text";
Scanner scanner = new Scanner(str);

เมื่อสร้างScannerวัตถุ เราจะส่งสตริงstrแทนSystem.inวัตถุ และตอนนี้scannerวัตถุจะอ่านข้อมูลจากสตริง ตัวอย่าง:

รหัสโปรแกรม: คำอธิบาย:
import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      System.out.println(a + b);
   }
}


// ก == 10; 
// ข == 20; 
เอาต์พุตหน้าจอจะเป็น:30