I/O คือเรื่องเกี่ยวกับการอ่านและเขียนข้อมูล รวมถึงการอ่านและเขียนข้อมูลลงบนไฟล์ ในหัวนี้จะอธิบายถึงการเขียนแบบตัวอักษรและสตริงเท่านั้น ไม่ได้รวมถึงการเขียนแบบไบต์ อย่างไรก็ตามจะเห็นได้ว่าการอ่านเขียนข้อมูลพวกนี้แทบจะไม่ได้เห็นในการเขียนโปรแกรมด้วยจาวาช่วงแรกๆเพราะจริงคือจาวาโดดเด่นเรื่องการเป็นโปรแกรมกราฟฟิค (graphically oriented programs) ไม่ใช่โปรแกรมตัวหนังสือ (text-based programs)
สตรีม
ท่อต่อสำหรับส่งและรับข้อมูล เหมือนจะส่งน้ำก็ต้องต่อท่อที่ส่งกับที่รับน้ำ(น้ำเป็นข้อมูล) สตรีมสามารถเอาไปต่อกับอะไรก็ได้ เช่น ขาเข้า(เข้ามาหาเรา)ก็เอาไปต่อกับ ดิสก์ ไฟล์ คีย์บอร์ดและซ็อกเก็ต(network socket) ก็ได้ เพื่อดูดข้อมูลจากแหล่งที่ไปต่อมาใช้งาน ส่วนขาออก(ออกไปที่ๆอยากจะส่งไป) ก็ไปต่อกับ console ดิสก์ ไฟล์ ซ็อกเก็ต ก็ได้
รูป 12-1
ท่อข้างบนเป็นท่อขาเข้าใช้สำหรับอ่านข้อมูล ส่วนท่อข้างล่างเป้นท่อขาออกสำหรับการเขียนข้อมูลออกไปข้างนอก
เรื่องทั่วไปของ System
System เป็นคลาสหนึ่งของจาวาที่ใช้กันบ่อยๆก่อนหน้านี้สำหรับการรับข้อมูลเข้าทางแป้นพิมพ์จาก System.in และการให้โปรแกรมแสดงผลลัพธ์ออกทาง console ด้วย System.out.println ใน System มีตัวแปร in, out ที่ประกาศเป็น public static ดังนั้นจึงสามารถใช้งานได้เลย
System.in เป็นอินพุตแบบมาตรฐาน โดยที่ System.in เป็นอ็อปเจ็คของ InputStream ส่วน System.out ก็เป็นเอาท์พุตแบบมาตรฐาน เป็นอ็อปเจ็คชนิด PrintStream
การอ่านข้อมูล
การอ่านข้อมูลสามารถทำได้ด้วยบัฟเฟอร์ดสตรีม (Buffered Stream) การอ่านเขียนข้อมูลแบบมีบัฟเฟอร์ดก็จะทำให้ประสิทธิภาพการรับส่งข้อมูลดีขึ้นกว่าไม่มี(แบบไม่มีคือใช้ Scanner แทนได้)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
นี่คือการเขียนบัฟเฟอร์ดเพื่อรับข้อมูลเข้าจากแป้นพิมพ์ เนื่องจากReader เป็น abstract ส่วน InputStream ไม่ได้เป็น abstract ก็เลยต้องเอา InputStream ที่เป็นคลาสลูกมาช่วยดูดข้อมูล และ System.in ก็เป็นอ็อปเจ็คของ InputStream สตรีมอีก ก็ให้เอาอ็อปเจ็บที่รับมาจากแป้นพิมพ์มาให้ InputStream หลังจากนั้นก็เก็บไว้ในตัวแปร br ของ BufferedReader
อ่าน character
Charactor คือตัวอักษรตัวเดียว ให้ใช้เมท็อด read() มาช่วยในการเก็บตัวอักษร โดย read() โยน IOException เพื่อป้องกันความผิดพลาด
int read()throws IOException
รูป12-2
บรรทัดที่ 3 : อิมพอร์ท java.io.*; แทนได้
บรรทัดที่ 9 : อย่าลืม throws IOException
บรรทัดที่ 12 : รับข้อมูลจากแป้นพิมพืมาใส่บัฟเฟอร์ด
บรรทัดที่ 17: ภายในลูป while ให้รับข้อมูลจนกระทั่งถ้าเป็น e ให้หยุดรับข้อมูลโดยรับข้อมูลโดย read()
รูป12-3
อ่านสตริง
คล้ายกับการรับข้อมูลตัวอักษรแต่เปลี่ยนเมท็อดที่ใช้เป็น readLine();
String readLine() throws IOException
รูป12-4
การเขียนข้อมูล
การเขียนข้อมูลหรือการส่งข้อมูลออกสามารถทำได้โดยใช้เมท็อด void write() สำหรับการเขียนข้อมูลตัวอักษรและ byte
นอกจากนี้ยังมีคลาส PrinWriter ซึ่งก็ทำงานเหมือนๆกับ print กับ println เขียนได้แบบนี้
PrinWriter pw = new PrinWriter(ตัวแปร.getOutputStream)
การอ่านและเขียนไฟล์
หัวข้อนี้เป็นเรื่องการเขียนและอ่านแฟ้มโดยเป็นแฟ้มแบบสตริงที่เปิดอ่านด้วยNotepad ได้ ซึ่งการเขียนและอ่านไฟล์สามารถใช้ Scanner และ PrintStream ร่วมกันก็ได้หรือจะใช้
FileInputStream(String fileName) throws FileNotFoundException
FileOutputStream(String fileName) throws FileNotFoundException
และเมท็อดที่ใช้ได้ดังนี้
void close() throws IOException
int read()throws IOException
void write()throws IOException
ตัวอย่างเช่น
รูป 12-5
โปรแกรมตัดเกรดจากไฟล์แล้วเซฟลงอีกไฟล์
บรรทัดที่ 10 : โปรแกรมนี้ใช้ Scanner ในการรับข้อมูล โดยมีการ new อ็อปเจ็คของไฟล์ขึ้นมาให้อ็อปเจ็คนี้ไป
เก็บข้อมูลจากพาธ(path) ตามในรูปก็คือ มีไฟล์ชื่อ score.txt ใน local disk e
รูป12-6
บรรทัดที่ 11 : ใช้คำสั่ง PrintStream สำหรับการเขียนข้อมูลออกไปเก็บโดยสร้างไฟล์ใหม่ขึ้นมาชื่อ grade.txt
สำหรับเก็บผลของการตัดเกรด
บรรทัดที่ 13 : ใช้เงื่อนไข while(sc.hasnext()) สำหรับการตรวจสอบว่ายังมีข้อมูลอยู่ในไฟล์หรือไม่ ถ้ามีจะคืน
ค่าจริงและทำงานต่อจนกว่าจะไม่มีข้อมูลในไฟล์ก็จะคืนค่าเท็จและออกจากลูป
บรรทัดที่ 15 : ให้เก็บข้อมูลจากอ็อปเจ็ค sc ด้วย nextLine() เพื่อเก็บข้อมูลแต่ละบรรทัดลงใน ตัวแปร person
คือเก็บข้อมูลของแต่ละคนไว้ หลังจากนั้น บรรทัดที่ 16 : ให้ใช้ trim() เพื่อตัดช่องว่างหน้าหลังออก
บรรทัดที่ 17 : ใช้ indexOf เพื่อหาช่องว่างจากตำแหน่งที่ 0 นี่เป็นเหตุผลว่าทำไมต้องใช้ trim() ก่อนเพราะ
ช่องว่างที่เราต้องการอยู่ตรงกลางเท่านั้น ต้องมั่นใจว่าจะไม่มีช่องว่างที่อื่นก่อนหน้าช่องวางตรงกลาง ดูจากรูป 12-6
บรรทัดที่ 20 : ตัด substring ก่อนช่องว่างเก็บเป็น id
บรรทัดที่ 21 : ตัด substring ครึ่งหลังเก็บเป็น คะแนน
บรรทัดที่ 22 : เอาสตริงคะแนนมาเปลี่ยนเป็น double
บรรทัดที่ 30 : ให้อ็อปเจ็คเรียก println เพื่อเก้บข้อมูลสำหรับส่งออก
บรรทัดที่ 33 : close(); ไฟล์เพื่อเซฟข้อมูลให้เรียบร้อย
ผลลัพธ์ที่ได้
ได้ไฟล์ใหม่ที่ตัดเกรดเรียบร้อยแล้ว
รูป 12-7
Tag ที่น่าสนใจ: i/o stream buffered_stream system_class inputstream printstream bufferedreader fileinputstream fileoutputstream scanner printwriter file_handling character string
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com