ในบทที่แล้ว เราได้เรียนรู้วิธีใช้อ็อบเจ็กต์ของคลาส Scanner เพื่อแยกวิเคราะห์ข้อมูลเป็นสตริง ดังนั้นในส่วนนี้ เราจะได้เรียนรู้วิธีใช้อ็อบเจ็กต์ของคลาส Scanner เพื่อแยกวิเคราะห์ข้อมูลในไฟล์
แอปพลิเคชันอาจต้องแยกวิเคราะห์ข้อมูลพิเศษในไฟล์ ในเวลานี้ แอปพลิเคชันสามารถอ่านเนื้อหาทั้งหมดของไฟล์ลงในหน่วยความจำแล้วแยกวิเคราะห์เนื้อหาที่ต้องการ ข้อดีคือ ความเร็วในการประมวลผลจะรวดเร็ว แต่หากอ่าน เนื้อหามีขนาดใหญ่ จะใช้หน่วยความจำมากขึ้นหมายถึงพื้นที่การซื้อขายตามเวลา
ในส่วนนี้จะแนะนำวิธีการใช้ คลาส Scanner และ นิพจน์ทั่วไป เพื่อแยกวิเคราะห์ไฟล์เป็นหลัก เช่น เพื่อแยกคำพิเศษ ตัวเลข และข้อมูลอื่นๆ ในไฟล์ ลักษณะของการใช้คลาส Scanner และนิพจน์ทั่วไปในการแยกวิเคราะห์ไฟล์คือเวลาจะถูกแลกเปลี่ยนเป็นพื้นที่ กล่าวคือ ความเร็วในการแยกวิเคราะห์ค่อนข้างช้า แต่หน่วยความจำจะถูกบันทึกไว้
สร้างออบเจ็กต์ Scanner และชี้ไปที่ไฟล์ที่จะแยกวิเคราะห์ เช่น:
Filefile=newFile(hello.java);Scannersc=newScanner(ไฟล์);
จากนั้น sc จะใช้ช่องว่างเป็นตัวคั่นและเรียกใช้เมธอด next() เพื่อส่งคืนคำในไฟล์ตามลำดับ หากเมธอด next() ส่งกลับคำสุดท้ายของไฟล์ sc จะเรียก hasNext() เพื่อส่งคืน false มิฉะนั้นจะส่งกลับ จริง.
นอกจากนี้ สำหรับคำที่เป็นตัวเลข เช่น 108, 167.92 เป็นต้น คุณสามารถใช้เมธอด nextInt() หรือ nextDouble() แทนเมธอด next() ได้ กล่าวคือ sc สามารถเรียกใช้เมธอด nextInt() หรือ nextDouble() วิธีการแปลงคำที่เป็นตัวเลขเป็น int หรือ Double data จะถูกส่งกลับ แต่สิ่งสำคัญคือต้องทราบว่าถ้าคำนั้นไม่ใช่คำที่เป็นตัวเลข InputMismatchException จะเกิดขึ้นเมื่อมีการเรียกเมธอด nextInt() หรือ nextDouble() เมื่อจัดการข้อยกเว้น สามารถเรียกเมธอด next() เพื่อส่งคืนคำที่ไม่ใช่ตัวเลขได้
สร้างอ็อบเจ็กต์ Scanner ชี้ไปที่ไฟล์ที่จะแยกวิเคราะห์ และใช้เมธอด useDelimiter เพื่อระบุนิพจน์ทั่วไปเป็นเครื่องหมายตัวคั่น ตัวอย่างเช่น:
Filefile=newFile(hello.java);Scannersc=newScanner(file);sc.useDelimiter(นิพจน์ปกติ);
จากนั้น sc จะใช้นิพจน์ทั่วไปเป็นตัวคั่นและเรียกใช้เมธอด next() เพื่อส่งคืนคำในไฟล์ตามลำดับ หากส่งคืนคำสุดท้ายของไฟล์ด้วยเมธอด next() ฟังก์ชัน sc จะเรียก hasNext() และมัน จะส่งคืนค่าเท็จ มิฉะนั้นจะส่งกลับค่าจริง
นอกจากนี้ สำหรับคำที่เป็นตัวเลข เช่น 1979, 0.618 เป็นต้น คุณสามารถใช้เมธอด nextInt() หรือ nextDouble() แทนเมธอด next() ได้ กล่าวคือ sc สามารถเรียกใช้เมธอด nextInt() หรือ nextDouble() วิธีการแปลงคำที่เป็นตัวเลขเป็น int หรือ Double data จะถูกส่งกลับ แต่สิ่งสำคัญคือต้องทราบว่าหากคำนั้นไม่ใช่คำที่เป็นตัวเลข InputMismatchException จะเกิดขึ้นเมื่อเรียกใช้เมธอด nextInt() หรือ nextDouble() ยกเว้น คุณสามารถเรียกใช้เมธอด next() เพื่อส่งคืนคำที่ไม่ใช่ตัวเลขได้
ตัวอย่างเช่น ใช้นิพจน์ทั่วไป (ตรงกับสตริงที่ไม่ใช่ตัวเลขทั้งหมด) String regex=[^0123456789.]+ เป็นเครื่องหมายคั่นเพื่อแยกวิเคราะห์คะแนนของนักเรียนในไฟล์ Student.txt และคำนวณเกรดเฉลี่ย
นักเรียน.txt
คะแนนของจางซานคือ 70 คะแนน คะแนนของ Li Si คือ 80 คะแนน และคะแนนของ Zhao Wu คือ 90 คะแนน
รหัสมีดังนี้:
importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(student.txt);Scannersc=null;intcount=0;doublesum=0;ลอง{doublescore=0;sc= newScanner(file);sc.useDelimiter([^0123456789.]+);ในขณะที่(sc.hasNextDouble()){score=sc.nextDouble();count++;sum=sum+score;System.out.println(score) ;}doubleaver=sum/count;System.out.println(คะแนนเฉลี่ย:+aver);}catch(Exceptionexp){System.out.println(exp);}}}