เราสามารถเขียนโปรแกรมอ่านไฟล์แบบ text(ไฟล์ที่เปิดอ่านด้วย text editor ได้) ด้วยคลาส Scanner โดยระบุตำแหน่งของไฟล์ที่ต้องการอ่าน เพื่อสร้างอินแสตนซ์ของคลาส Scanner และใช้อินสแตนซ์ดังกล่าว ในการอ่านข้อมูลขึ้นมาแบบลำดับ จากตำแหน่งแรกของข้อมูลบนไฟล์ ไปยังข้อมูลถัดไปด้วยการใช้เมธอด next(?)  เมื่ออ่านแล้วจะมีการย้ายตำแหน่งการอ่านไปยังข้อมูลตัวถัดไป การอ่านข้อมูลด้วยเมธอด next(?) มีหลายแบบขึ้นอยู่กับชนิดข้อมูลที่ต้องการอ่านขึ้นมา เช่น

  • next( )   อ่านข้อมูลชนิด String
  • nextLine( )  อ่านข้อมูลเป็นชนิด String  ทั้งบรรทัด
  • nextInt( ) อ่านข้อมูลชนิด integer
  • nextDouble( ) อ่านข้อมูลชนิด double
  • nextBoolean( ) อ่านข้อมูลชนิด boolean
  • อื่น ๆ ( อ่านเพิ่มเติมใน Java API  )

ตัวอย่างการอ่านไฟล์ input.txt มีข้อมูลดังนี้

Greeter 
123   22
22.25  c d
false
I love a loney way.

รูปแบบโค๊ดในการอ่านจะเป็นดังนี้

Scanner sc = new Scanner(new File("input.txt"));
sc.next(); //Greeter
sc.nextInt();//123
sc.nextInt();//22
sc.nextDouble();//22.25
sc.nextLine();//"c d"
sc.nextBoolean();//false
sc.nextChar();//'I'
sc.nextLine();//"love a loney way."

นอกจากเมธอด next(?) แล้วยังมีเมธอดที่ใช้ควบคุมการอ่านข้อมูลของ Scanner คือ hasNext(?) ซึ่งเราสามารถนำมาประยุกต์ใช้กับข้อมูลที่มีลักษณะของการจัดเก็บที่มีรูปแบบชัดเจน โดย hasNext(?) มีหลายตัวเช่น hasNext() hasNextLine( ) hasNextInt() เป็นต้น ซึ่งขึ้นอยู่กับรูปแบบการควบคุมที่เราต้องการใช้งาน

ตัวอย่างไฟล์ student.dat ที่มีข้อมูลดังนี้

5411200260  Peter Width  3.44
5411200261  Charnwidj Pholcheewin  2.59
5411200262  Supatchai  Aimtrakool  1.04
5411200263  Raksana  Watjomjai  3.88
5411200264  Komin  Sreetanan  3.25
...

ต่อไปนี้ผมจะแสดงโค๊ดโปรแกรมสำหรับการอ่านไฟล์ student.dat เพื่อนำเก็บไว้ใน collection ชนิด ArrayList ของ Student จากตัวอย่างในบทความที่แล้ว(ตัวอย่างการเรียงวัตถุโดยใช้ Collection.sort ในจาวา)ครับ

ArrayList<Student> students=new ArrayList<Student>();
Scanner sc = new Scanner(new File("student.dat"));
while(sc.hasNextLine()){ //ตรวจสอบว่าบรรทัดถัดไปมีข้อมูลอยู่หรือไม่
  String id= sc.next();
  String name= sc.next()+" "+sc.next(); //อ่านชื่อและนามสกุลทีละตัว
  double gpa= sc.nextDouble();
  Student std=new Student(id,name,gpa);
  students.add(std);
}

คนที่สนใจแนะนำอ่านบทความนี้ต่อได้เลยครับ(ผมเคยเขียนบทความนี้ไว้ประมาณเกือบ 1 ปีที่แล้ว)

กรณีศึกษา เขียนโปรแกรม fortune ด้วย java

ผมขอจบเรื่องการอ่านไฟล์ขอ้มูลแบบ text ด้วยคลาส Scanner ไว้เพียงเท่านี้ ขอบคุณที่อ่านจนจบครับ

Advertisements

9 คิดบน “การอ่านไฟล์แบบ text ด้วยคลาส Scanner

  1. ผมยังไม่เข้าใจอย่างกะจ่างกับตัว next(); กับ nextLine(); เลยครับว่ามันแตกต่างกันยังไง ช่วยอธิบายให้ผมกะจ่างที่ครับผม ^^

    1. ฟังก์ชั่่น next() เป็นการอ่านคำถัดไปมาเก็บไว้เป็น String ครับ ส่วน nextLine() จะเป็นการอ่าน ทั้งบรรทัดครับ ยกตัวอย่างข้อมูลนี้ครับ

      soowoi detsuka 24
      yhotyoi yhotyoi 20

      สมมติว่า คุณ yhotyhoi ใช้คำสั่ง next( ) จำนวน 1 ครั้งในการอ่านผลลัพธ์ที่ได้คือ

      “soowoi”

      หัวอ่านของคลาส scanner จะเลื่อนมาที่ท้ายคำของ “soowoi” ครับ ถ้าต้องการอ่านคำถัดไป ก็ใช้ next() อีกครั้งจะได้

      “detsuka”

      หัวอ่านก็จะย้ายมาท้ายคำว่า detsuka ครับ

      คราวนี้มาดู nextLine( ) บ้าง ถ้าหัวอ่านกรอกลับไปที่หน้าคำว่า soowoi นะครับ เมื่อเราเรียกใช้ nextLine( )
      ผลลัพธ์จะได้

      “soowoi detsuka 24”

      จากนั้นหัวอ่านจะมาอยู่หลังคำว่า 24 ครับ พอเรียก nextLine( ) ครั้งถัดไปก็จะได้

      “yhotyoi yhotyoi 20”

      แค่นี้เองครับ 😀

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s