ทำงานกับ File และStream บทที่ 9 ทำงานกับ File และStream
รู้จักกับ Stream โปรแกรมของคุณทำการอ่านหรือเขียนข้อมูลจากอุปกรณ์ I/O ภายนอกโดยมีสะพานส่งผ่านข้อมูลอยู่ระหว่างกลาง และเมื่อไหร่ก็ตามที่มีข้อมูลเดินทางผ่านสะพานนี้ Java ก็จะเรียกมันว่า Stream
การทำงานแบบ Byte Stream Byte Stream เป็น Stream ที่ Java ใช้สำหรับการเขียนหรืออ่านข้อมูลแบบเครื่อง (machine-formatted data) โดยทำการสร้างคลาสย่อยขึ้นมาจากคลาส InputStream และ OutputStream แต่เป็นภาษาที่มนุษย์ไม่เข้าใจ ต้องผ่านกระบวนการ InputStream อีกครั้งจึงจะออกมาเป็นข้อความที่มนุษย์เข้าใจได้
การทำงานแบบ Character Stream Character Stream คือการอ่านและเขียนข้อมูลด้วยภาษาที่มนุษย์เข้าใจ โดยสร้างออบเจ็กต์ขึ้นมาจากคลาส 2 คลาสคือ Reader และ Writer โดยผ่านกระบวนการแปลค่าให้อยู่ในรูปจำนวนบิตที่เหมาะสม
คลาสสำหรับอ่านเขียนไฟล์ import java.io.*; Object Reader Writer FileReader + BufferedReader InputStreamReader FileReader - FileInputStream OutputStreamReader FileWriter FileOutoutStream FlieWriter + PrintWriter
Exception ในภาษาจาวา หากโปรแกรมที่เขียนมีความผิดพลาดเกิดขึ้น จะมีการดักจับข้อผิดพลาดต่างๆด้วย เรียกว่า Exception handling Method บางประเภท หากนำมาใช้งานจะต้องเขียนโปรแกรมสำหรับดักจับข้อผิดพลาดด้วย โดยมากเป็นเมธอดที่เกี่ยวข้องกับ input&output Exception handling ทำได้หลายวิธี เช่นการใช้คำสั่ง throws
ทำงานกับไฟล์ด้วย File Stream
ทำงานกับไฟล์ด้วย File Stream รูปแบบการสร้าง InputStream มี 2 รูปแบบดังนี้ หรือ FileReader in = new FileReader( ชื่อไฟล์ ); FileInputStream in = new FileInputStream( ชื่อไฟล์ );
การอ่านไฟล์ ตัวอย่าง
import java.io.*;
ทำงานกับไฟล์ด้วย File Stream หรือ รูปแบบการเขียน File Stream กรณีเขียนต่อท้ายลงไปที่ไฟล์ที่มีอยู่เดิม File fileObject = new File(“ ชื่อไฟล์และแหล่งที่อยู่ของไฟล์ ”); FileWriter f = new FileWriter( “ ชื่อไฟล์และแหล่งที่อยู่ของไฟล์ ”, false ); File fileObject = new File( “ ชื่อไฟล์และแหล่งที่อยู่ของไฟล์ ” ); FileWriter f = new FileWriter( “ ชื่อไฟล์และแหล่งที่อยู่ของไฟล์ ”, true );
การเขียน File Stream ตัวอย่าง
การอ่านข้อมูลแบบ textflie สร้างออปเจ็กต์ของคลาสเพื่อเปิดไฟล์ สร้างออปเจ็กต์ของคลาสเพื่ออ่านข้อมูล เมธอด inputFile .readLine(); inputFile.close(); FileReader fReader = new FileReader(“filename.txt”); BufferedReader inputFile = new BufferedReader (fReader);
การเขียนข้อมูลแบบ textflie สร้างออปเจ็กต์ของคลาสเพื่อเปิดไฟล์ สร้างออปเจ็กต์ของคลาสเพื่ออ่านข้อมูล เมธอด outputFile .println(String); outputFile .print(String); outputFile.close(); FileWriter fWriter = new FileWriter(“filename.txt”); PrintWriter outputFile = new PrintWriter (fWriter);
เมธอดต่างๆ เกี่ยวกับไฟล์ เมธอด renameTo( ) ใช้เมื่อต้องการจะย้ายไฟล์ หรือเปลี่ยนชื่อไฟล์ ในกรณีที่เราระบุที่เก็บของไฟล์ชื่อใหม่ปลายทางด้วย นั่นหมายถึงเป็นการย้ายไฟล์ แต่ถ้าไม่ระบุที่เก็บไฟล์ก็เป็นการเปลี่ยนชื่อไฟล์ที่ยังคงวางอยู่ที่เดิม รูปแบบการใช้งานเมธอด renameTo( ) เมธอด delete ใช้ลบไฟล์ โดยจะคืนค่าเป็นจริงเมื่อไฟล์นั้นมีอยู่จริง และสามารถทำการลบได้สำเร็จ ถ้าไม่ฉะนั้นจะคืนค่าที่เป็นเท็จ รูปแบบการใช้งานเมธอด delete( ) ชื่อออบเจ็กต์ของไฟล์เดิม . renameTo(ชื่อออบเจ็กต์ของไฟล์ใหม่ ); ชื่อออบเจ็กต์ของไฟล์เดิม.delete( )
การใช้งานเมธอด renameTo( ) import java.io.*; import java.io.File; public class FileRenameTo { public static void main(String[] args) throws IOException { File f1 = new File("d:/textfun.txt"); File f2 = new File("d:/textfunny.txt"); if (f1.renameTo(f2) == true) System.out.println("Rename is success."); else System.out.println("Rename is fail!"); }
การใช้งานเมธอด delete( ) import java.io.*; import java.io.File; public class FileDelete { public static void main(String[] args) throws IOException { String strDel = "d:/textfunny.txt"; File fDel = new File(strDel); if (fDel.delete() == true) System.out.println("File " + strDel + " is deleted."); else System.out.println("Delete fail!"); }
เมธอดต่างๆ เกี่ยวกับไฟล์ เมธอด length( ) ใช้ดูขนาดของไฟล์ เมธอดนี้จะคืนค่าเป็นค่าขนาดของไฟล์ ซึ่งมีหน่วยเป็นไบต์ รูปแบบการใช้งานเมธอด length( ) เมธอด mkdir จะเป็นเมธอดที่ใช้สร้างไดเร็คทอรี พร้อมกับคืนค่าเป็นจริงเมื่อสามารถสร้างได้สำเร็จ และคืนค่าเป็นเท็จเมื่อไม่สามารถทำการสร้างไดเร็คทอรีได้ รูปแบบการใช้งานเมธอด mkdir( ) ชื่อออบเจ็กต์ของไฟล์.length ( ); ชื่อออบเจ็กต์ของไดเร็คทอรี.mkdir( );
เมธอดต่างๆ เกี่ยวกับไฟล์ เมธอด getAbsolutePath นี้จะใช้เมื่อเราต้องการทราบไดเร็คทอรีที่เก็บไฟล์ รูปแบบการใช้งานเมธอด getAbsolutePath เมธอด exist( ) ตรวจสอบว่าไฟล์ดังกล่าวมีอยู่หรือไม่ รูปแบบการใช้งานเมธอด exist ชื่อออบเจ็กต์ของไฟล์.getAbsolutePath ( ) ; ชื่อออบเจ็กต์ของไฟล์.exists( ) ;
เมธอดต่างๆ เกี่ยวกับไฟล์ เมธอด canWrite( ) และเมธอด canRead( ) ทั้งสองเมธอดเป็นการตรวจสอบคุณสมบัติของไฟล์ว่าสามารถถูกนำไปเปิดอ่าน หรือ เขียนได้หรือไม่ รูปแบบการใช้งานเมธอด canWrite รูปแบบการใช้งานเมธอด canRead ชื่อออบเจ็กต์ของไฟล์.canWrite ( ) ; ชื่อออบเจ็กต์ของไฟล์.canRead ( ) ;
เมธอดต่างๆ เกี่ยวกับไฟล์ เมธอด isFile( ) เป็นเมธอดที่ใช้ตรวจสอบว่าออบเจ็กต์ที่ต้องการตรวจสอบเป็นไฟล์หรือไม่ รูปแบบการใช้งานเมธอด isFile เมธอด isDirectory( ) เป็นเมธอดที่ใช้ตรวจสอบว่าออบเจ็กต์ที่ต้องการตรวจสอบเป็นไดเร็คทอรีหรือไม่ รูปแบบการใช้งานเมธอด isDirectory ชื่อออบเจ็กต์ของไฟล์.isFile( ); ชื่อออบเจ็กต์ของไฟล์.isDirectory( );
ก่อนจบบท สำหรับบทนี้เราได้เรียนรู้เกี่ยวกับการเขียนโปรแกรมเพื่อจัดการกับไฟล์ ซึ่งมีทั้งไฟล์ที่ข้อมูลนั้นอยู่ในรูปแบบที่มนุษย์อ่านแล้วเข้าใจ และอยู่ในรูปแบบที่อ่านเข้าใจได้ยาก (เครื่องคอมพิวเตอร์อ่านเข้าใจ) โดยใช้กลไกที่เรียกว่า Stream เป็นพระเอกในการจัดการ นอกจากนี้เรายังใช้งานคลาส File ในการจัดการกับไฟล์ในระบบคอมพิวเตอร์ของเรา ซึ่งจะคล้ายคลึงกับคำสั่งที่เราจัดการไฟล์ตามปกติ ซึ่งจะมีประโยชน์มากกับโปรแกรมที่ต้องการจัดการไฟล์เหล่านั้นอัตโนมัติ
Assignment#5 จงเขียนโปรแกรมเก็บตัวเลขจำนวนเต็ม 1 ถึง 10 ลงไปในไฟล์ จงเขียนโปรแกรมอ่านไฟล์ในข้อ 1 ขึ้นมาแสดงผล จงเขียนโปรแกรมอ่านไฟล์ที่ได้จากข้อ 1 มาคูณด้วย 2 แล้วแสดงผลทางจอภาพ จงคำนวณค่าของฟังก์ชัน F(x) = x2 + 3x + 8 โดย x เป็นจำนวนเต็มมีค่าตั้งแต่ 1 ถึง 10 แล้วนำค่าที่ได้เก็บลงไฟล์ จงเขียนโปรแกรมอ่านไฟล์ผลลัพธ์จากข้อ 4 มาแสดงผลทางจอภาพ