Transcript Slide 1
ทำงำนกับไฟล ์ (File I/O) ไฟล ์ (File) คือ ข้อมูลตำงๆ ทีถ ่ ูกจัดเก็บและ ่ บันทึกไวในหน ้ ่ วยควำมจำของคอมพิวเตอร ์ มี หลำกหลำยประเภท เช่น ไฟลข ้ ลเอกสำร ์ อมู ไฟลรู์ ป เป็ นตน ้ โปรแกรมจะอำนหรื อเขียนขอมู ่ ้ ลเหลำนั ่ ้นโดยมี สะพำนส่งผำนข อมู ำงกลำง ใช้ส่งขอมู ่ ้ ลอยูระหว ่ ่ ้ ล จำกต้นทำง (source) ไปยังปลำยทำง (sink) และ เมือ ่ มีกำรอำนหรื อเขียนขอมู ้ จะ ่ ้ ลผำนสะพำนนี ่ เรียกวำ่ Stream และจะถูกนำไปใช้ในกำร กระบวนกำรของโปรแกรมนั่นเอง 2 File Stream หมำยถึง ทอส น ่ ่ งขอมู ้ ลไฟลจำกต ์ ้ ทำงไปยังปลำยทำง ประกอบดวยคลำส FileInputStream / ้ FileOutputStream สำหรับ กำรอำนและเขี ยนขอมู ่ ้ ล โดยเมธอดของคลำสจะ อยูในแพ็ คเกจ java.io ่ มีคลำสสำหรับกำรสรำงออบเจ็ กต ์ Stream 4 ้ คลำส ไดแก ้ ่ InputStream ใช้ในกำรรับชนิดขอมู ้ ลแบบ byte หรือ numeric type OutputStream ใช้ในกำรส่งชนิดขอมู ้ ลแบบ byte หรื3อ เป็ นกำรเขียนและอำนไฟล ครั ่ ์ ง้ ละ 1 ไบต ์ (8 บิต) ใช้สำหรับรับส่งขอมู ้ ลประเภท Byte หรือขอมู ้ ล ประเภทตัวเลข (Numeric) จะต้องทำผำนคลำส FileOutputStream และ ่ FileInputStream ซึง่ อยูในแพ็ คแกจ java.io.OutputStream และ ่ java.io.InputStream ตำมลำดับ ข้อมูลถูกจัดเก็บเป็ นไบต ์ (Binary File) และไม่ สำมำรถจะอำนเข ำใจได ่ ้ ้ 4 จะใช้งำนคลำส File รวมกั บคลำส FileOutputStream ่ ในกำรเขียนขอมู ้ ลลงไฟล ์ โดยใช้เมธอด write() ของ คลำส FileOutputStream มีรูปแบบดังนี้ File filename = new File(“path”); FileOutputStream fOutput = new FileOutputStream(filename, append); fOutput.write(data); หรือ FileOutputStream fOutput = new FileOutputStream(path, append); fOutput.write(data); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส 5 จะใช้งำนคลำส File รวมกั บคลำส FileInputStream ่ ในกำรอำนข อมู ่ ้ ลจำกไฟล ์ ใช้เมธอด read() ของคลำส FileInputStream และจะ คืนคำเป็ ่ อำนข อมู ่ นเลขจำนวนเต็ม -1 เมือ ่ ้ ลถึงไบต ์ สุดทำยของไฟล ้ ์ มีรูปแบบ ดังนี้ File filename = new File(“path”); FileInputStream fInput = new FileInputStream (filename); data = fInput.read(); หรือ FileInputStream fOutput = new FileInputStream (path); data = fOutput.read(); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส 6 ByteTest 7 เป็ นกำรอำนและเขี ยนไฟลครั ่ ์ ง้ ละ 2 ไบต ์ (16 บิต) ใช้สำหรับรับส่งขอมู ้ ลประเภทตัวอักขระ (Character) จัดกำรโดยใช้คลำส FileReader และ FileWriter ซึง่ อยูในแพ็ คแกจ java.io.Reader และ ่ java.io.Writer ตำมลำดับ ข้อมูลในไฟลจะถู กจัดเก็บเป็ นกลุมตั ์ ่ วอักขระ (Text File) ซึง่ สำมำรถอำนเข ำใจได ่ ้ ้ 8 จะใช้งำนคลำส File รวมกั บคลำส FileWriter ในกำร ่ เขียนขอมู ้ ลลงไฟล ์ ใช้เมธอด write() ของคลำส FileWriter มีรูปแบบ ดังนี้ File filename = new File(“path”); FileWriter fOutput = new FileWriter(filename, append); fOutput.write(data); หรือ FileWriter fOutput = new FileWriter(path, append); fOutput.write(data); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส fOutput เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส FileWriter 9 จะใช้งำนคลำส File รวมกั บคลำส FileReader ใน ่ กำรอำนข อมู ่ ้ ลจำกไฟล ์ ใช้เมธอด read() ของคลำส FileReader และจะคืน คำเป็ ่ สิ้ นสุดกำรอำนข อมู ่ นเลขจำนวนเต็ม -1 เมือ ่ ้ ลจำก ไฟล ์ มีรูปแบบ ดังนี้ File filename = new File(“path”); FileReader fInput = new FileReader (filename); data = fInput.read(); หรือ FileReader fOutput = new FileReader (path); data = fOutput.read(); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส 10 CharTest ผลทีไ่ ดจำกกำรใช ้ ้เมธอด print() จะเป็ นคำตั ่ วเลขรหัส แอสกีข ้ องตัวอักขระ และ สำมำรถใช้เมธอด write() แสดงผลข้อมูลเป็ นตัวอักขระได้ 11 Buffer Stream เป็ นทีพ ่ ก ั ในหน่วยควำมจำในกำรรับส่งขอมู ้ ลผำน ่ buffer ซึง่ เป็ นกำรนำขอมู ่ อง กำรอำนหรื อเขียนลงไฟลไปเก็ บ ้ ลทีต ้ ่ ์ ไว้ในหน่วยควำมจำกอน เพือ ่ ช่วยเพิม ่ ประสิ ทธิภำพให้โปรแกรม ่ มำกขึน ้ ทำงำนเร็วขึน ้ คลำส Buffer ของ Byte Stream คือคลำส BufferedInputStream และ BufferedOutputStream ส่วนคลำส Buffer ของ Character Stream คือคลำส BufferedReader และ BufferedWriter กำรใช้งำนคลำส buffer จะต้องสรำงออบเจ็ กตเพื ่ เชือ ่ มตอ ้ ่ ์ อ ออบเจ็กตของคลำส FileInputStream กับ FileOutputStream ์ หรือ FileReader กับ FileWriter 12 มีรูปแบบกำรใช้งำนคลำส BufferedOutputStream สำหรับเขียนขอมู ้ ลแบบ Byte Stream ดังนี้ File filename = new File(Path); FileOutputStream f_out = new FileOutputStream(filename); BufferedOutputStream b_out = new BufferedOutputStream(f_out); b_out.write(data); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส f_out เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส FileOutputStream b_out เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส 13 มีรูปแบบกำรใช้งำนคลำส BufferedInputStream สำหรับอำนข ่ ้อมูลแบบ Byte Stream ดังนี้ File filename = new File(Path); FileInputStream f_in = new FileInputStream(filename); BufferedInputStream b_in = new BufferedInputStream(f_in); data = b_in.read(); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส f_in เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส FileOutputStream b_in เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส BufferedOutputStream data เป็ นข้อมูลทีอ ่ ำนได จำกไฟล ่ ้ ์ 14 ByteBuffTest 15 มีรูปแบบกำรใช้งำนคลำส BufferedWriter สำหรับเขียน ข้อมูลแบบ Chacracter Stream ดังนี้ File filename = new File(Path); FileWriter f_write = new FileWriter(filename); BufferedWriter b_write = new BufferedWriter(f_write); b_write.write(data); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส f_write เป็ นออบเจ็กตที ่ รำงจำกคลำส FileWriter ้ ์ ส b_write เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส BufferedWriter data เป็ นข้อมูลทีต ่ องกำรเขี ยนลงไฟล ์ ้ 16 มีรูปแบบกำรใช้งำนคลำส BufferedReader สำหรับอำน ่ ข้อมูลแบบ Chacracter Stream มีดงั นี้ File filename = new File(Path); FileReader f_ read= new FileReader(filename); BufferedReader b_read = new BufferedReader(f_read); data = b_read.readLine(); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส f_read เป็ นออบเจ็กตที ่ รำงจำกคลำส FileReader ้ ์ ส b_read เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส BufferedReader data เป็ นข้อมูลทีอ ่ ำนได จำกไฟล ่ ้ ์ 17 CharBuffTest 18 CharSkipTest 19 ใช้เมธอด print() และ println() ซึ่งมีกำรโอเวอรโหลด ์ ให้รับคำข ้ ฐำนไดทั ่ อมู ้ ลทีเ่ ป็ นชนิดพืน ้ ง้ หมด มีรูปแบบ กำรใช้งำนคลำส PrintWriter ดังนี้ File filename = new File(path); FileWriter f_write = new FileWriter(filename); BufferedWriter b_write = new BufferedWriter(f_write); PrintWriter p_write = new PrintWriter(b_write); p_write.printIn(data); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส f_write เป็ นออบเจ็กตที ่ รำงจำกคลำส FileWriter ้ ์ ส b_write เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส BufferedWriter 20 กำรจัดเก็บขอมู ่ ระกอบดวยชนิ ดขอมู น ้ ลทีป ้ ้ ลแตกตำงกั ่ ควรใช้กำรอำนและเขี ยนขอมู Binary ่ ้ ลลงไฟลประเภท ์ File แตถ Character Stream ก็ ่ ้ำต้องกำรทำดวย ้ สำมำรถทำไดโดยกำรคั น ่ ขอมู ดทีจ ่ ะเขียนลง ้ ้ ลแตละชนิ ่ ไฟลด “\t” ้ ์ วย CharWriteTest เขียนขอมู ้ ลลงไฟล ์ CharScore.txt 21 CharReadTest 22 มีรูปแบบกำรใช้งำนคลำส DataOutputStream ดังนี้ File filename = new File(path); FileOutputStream f_out = new FileOutputStream(filename); BufferedOutputStream b_out = new BufferedOutputStream(f_out); DataOutputStream d_out = new DataOutputStream(b_out); d_out.methodName(data); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส f_out เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส FileOutputStream b_out เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส BufferedOutputStream 23 d_out เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส File filename = new File(Path); FileInputStream f_in = new FileInputStream(filename); BufferedInputStream b_in = new BufferedInputStream(f_in); DataInputStream d_in = new DataInputStream(b_in); data = d_in.methodName(); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส f_in เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส FileInputStream b_in เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส BufferedInputStream d_in เป็ นออบเจ็กตที ่ รำงจำกคลำส ้ ์ ส 24 DataInputStream ชือ ่ เมธอด readBoolean() readByte() readUnsigned Byte() readInt() readShort() readUnsigned Short() readLong() readFloat() readDouble() readChar() คำอธิบำย อำนค ำข ่ ่ อมู ้ ลชนิด boolean อำนค ำข ่ ่ อมู ้ ลชนิด byte อำนค ำข ่ ่ อมู ้ ลชนิด byte แบบ unsigned (ไมมี ่ คำติ ่ ดลบ) อำนค ำข ่ ่ อมู ้ ลชนิด int อำนค ำข ่ ่ อมู ้ ลชนิด short อำนค ำข ่ ่ อมู ้ ลชนิด short แบบ unsigned (ไมมี ่ คำติ ่ ดลบ) อำนค ำข ่ ่ อมู ้ ลชนิด long อำนค ำข ่ ่ อมู ้ ลชนิด float อำนค ำข ่ ่ อมู ้ ลชนิด double อำนค ำข ่ ่ อมู ้ ลชนิด char อำนค ำข ป ่ ่ อมู ้ ลชนิด String จำกไฟลในรู ์ 25 ชือ ่ เมธอด writeBoolean(boolea n) writeByte(int) writeInt(int) writeShort(int) writeLong(long) writeFloat(float) writeDouble(double) writeChar(int) คำอธิบำย เขียนขอมู ้ ลชนิด boolean (1 byte) ลงในไฟล ์ เขียนขอมู ่ ่ งมำ) ้ ลชนิด byte (1 byte ของ int ทีส ลงในไฟล ์ เขียนขอมู ้ ลชนิด int (4 byte) ลงในไฟล ์ เขียนขอมู ้ ลชนิด short (ข้อมูล 2 byte ) ลงในไฟล ์ เขียนขอมู ้ ลชนิด long (ข้อมูล 8 byte) ลงในไฟล ์ เขียนขอมู ่ ่ง ้ ลชนิด float ลงในไฟล ์ โดย float ทีส มำจะถูกแปลงไปเป็ น int ดวยเมธอด floatToIntBits ้ ของคลำส Float เขียนขอมู ้ ลชนิด double ลงในไฟล ์ โดย double ทีส ่ ่ งมำจะถูกแปลงไปเป็ น long ดวยเมธอด ้ doubleToLongBits ของคลำส Double เขียนขอมู ้ ลชนิด int (หมำยถึงเขียนขอมู ้ ลชนิด 2byte) ลงในไฟล ์ เขียนขอมู ้ ลชนิด String ลงในไฟล ์ ในรูปของ 26 ByteDataOutputTest 27 เมือ ่ เปรียบเทียบกับกำรจัดกำรขอมู ้ ลแบบ Character Stream ดวยคลำส ้ ByteDataInputTest PrintWriter และ FileReader พบวำ่ • กำรใช้งำนคลำส PrintWriter และ FileReader จะมีขน ้ั ตอนทีย ่ งยำกกว ุ่ ำ่ เนื่องจำกเป็ นกำรเขียนเขียนข้อมูลลงไฟลที ์ ละบรรทัด และในกรณีทม ี่ ข ี อมู ้ ลมำกกวำ่ 1 คำ่ จะต้องใช้เครือ ่ งหมำย “\t” คัน ่ ระหวำงข อมู ่ อำนข อมู ่ ้ ล เมือ ่ ้ ลก็จะต้องแยก ข้อมูลดวยเครื อ ่ งหมำย “\t” เช่นกันจึงเป็ น ้ กำรจัดกำรทีย ่ งยำก ุ่ • กำรจัดกำรขอมู ้ ลแบบ Character Stream จึงเหมำะกับขอมู ้ ลทีเ่ ป็ นข้อควำม ส่วนกำรจัดกำรแบบ Byte Stream เหมำะ กับข้อมูลชนิดพืน ้ ฐำนทีแ ่ ตกตำงกั น 28 ่ File อยูในแพ็ คแกจ java.io จะประกอบดวยเมธอดที ช ่ ่ วย ่ ้ ในกำรทำงำนกับ file หรือ directory เช่น absolute path, last modify หรือ ขนำดของไฟล ์ เป็ นต้น มีรูปแบบกำรใช้งำนคลำส File ดังนี้ File filename = new File(Path); โดยที่ path เป็ นชือ ่ และตำแหน่งทีอ ่ ยูของไฟล ่ ์ filename เป็ นออบเจ็กตที ่ รำงจำกคลำส File ้ ์ ส 29 ชือ ่ เมธอด canRead() canWrite() delete() exist() getName() getParent() getPath() isDirectory() isFile() length( ) mkdir คำอธิบำย ตรวจสอบคุณสมบัตข ิ องไฟลว์ ำสำมำรถถู กนำไปเปิ ด ่ อำนได หรื ่ ้ อไม่ ตรวจสอบคุณสมบัตข ิ องไฟลว์ ำสำมำรถถู กนำไปเปิ ด ่ เขียนไดหรื ้ อไม่ ลบไฟล ์ โดยคืนคำเป็ ่ ไฟลนั ่ นจริงเมือ ์ ้นมีอยูจริ ่ งและ สำมำรถลบไดส ้ ำเร็จ ตรวจสอบวำไฟล ดั อยูหรื ่ ์ งกลำวมี ่ ่ อไม่ ให้คำเป็ ่ ไฟล ์ ่ นชือ ให้คำเป็ ่ นพำธหรือไดเร็คทอรีของไดเร็คทอรีทเี่ ก็บ ไฟล ์ ให้คำเป็ ่ นพำธหรือไดเร็คทอรีของไฟล ์ ตรวจสอบออบเจ็กตว์ ำเป็ ่ นไดเร็คทอรีหรือไม่ ตรวจสอบออบเจ็กตว์ ำเป็ ่ นไฟลหรื ์ อไม่ ให้คำเป็ ่ นขนำดของไฟล ์ ซึ่งมีหน่วยเป็ นไบต ์ ใช้สร้ำงไดเร็คทอรี พร้อมกับคืนคำเป็ ่ ่ นจริงเมือ สำมำรถสร้ำงไดส ้ ำเร็จ 30 FileMethod 31