“สวัสดี อามีโก้!”

“สวัสดี เอลลี่!”

"วันนี้เราจะมาศึกษา I/O streams"

"ใช่ ฉันรู้ทุกอย่างเกี่ยวกับพวกเขาแล้ว เราใช้คลาส FileInputStream และ FileOutputStream ที่นี่"

"ใช่ แล้วคุณรู้วิธีใดของชั้นเรียนเหล่านี้บ้าง"

"แน่นอน นี่คือวิธีการของ FileInputStream:"

วิธี คำอธิบาย
int read() อ่านหนึ่งไบต์และส่งคืน
int read(byte b[]) อ่านอาร์เรย์ไบต์และส่งกลับ
int read(byte b[], int off, int len) อ่านอาร์เรย์ไบต์จากสตรีม
long skip(long n) ข้าม n ไบต์ ใช้เมื่ออ่านจากสตรีม
int available() ส่งกลับจำนวนไบต์ที่ยังสามารถอ่านได้จากสตรีม
void close() ปิดสตรีม

"ตรงประเด็น! และวิธีการของ FileOutputStream?"

"ลองดูสิ:"

วิธี คำอธิบาย
void write(int b) เขียนหนึ่งไบต์ไปยังสตรีม
void write(byte b[]) เขียนอาร์เรย์ของไบต์ไปยังสตรีม
void write(byte b[], int off, int len) เขียนอาร์เรย์ของไบต์ไปยังสตรีม
void close() ปิดสตรีม

“อามีโก้ คุณทำให้ฉันประหลาดใจ!”

"แล้วบางส่วน!"

"ก็ได้ ฉันจะให้คลาสใหม่สองคลาสแก่คุณ: ZipInputStream และ ZipOutputStream"

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? เหมือนไฟล์ zip หรือเปล่า "

"ถูกต้อง สตรีมเหล่านี้ออกแบบมาเพื่อทำงานกับไฟล์ zip คุณสามารถใช้มันเพื่ออ่านหรือเขียนโดยตรงไปยังไฟล์ zip!"

"Holy moly! น่าสนใจจัง แต่ไฟล์ zip จะมีไฟล์เดียวไม่ได้ แต่มีหลายไฟล์ ไฟล์เหล่านี้ทำงานอย่างไร"

"สำหรับสิ่งนั้น มีอีกคลาสพิเศษ: ZipEntryมันนำเสนอไฟล์ที่เก็บไว้ในไฟล์เก็บถาวร คุณสามารถอ่าน วัตถุ ZipEntryจากZipInputStream เท่านั้น และคุณสามารถเขียน วัตถุ ZipEntryไปยังZipOutputStream ได้เท่านั้น แต่กลายเป็นว่าคุณสามารถอ่านและ เขียนไปยังZipEntryเหมือนกับไฟล์ทั่วไป"

"คุณช่วยยกตัวอย่างวิธีการทำงานให้ฉันหน่อยได้ไหม"

"แน่นอน นี่คือตัวอย่างที่เราสร้างไฟล์เก็บถาวรและใส่ไฟล์ลงไป:"

รหัส
// Create an archive
FileOutputStream zipFile = new FileOutputStream("c:/archive.zip");
ZipOutputStream zip = new ZipOutputStream(zipFile);

//Put a ZipEntry into it
zip.putNextEntry(new ZipEntry("document.txt"));

//Copy the file «document-for-archive.txt» to the archive under the name «document.txt»
File file = new File("c:/document-for-archive.txt");
Files.copy(file.toPath(), zip);

// Close the archive
zip.close();

"น่าสนใจจัง! และการแตกไฟล์ก็ง่ายเหมือนกันนะเนี่ย"

"อ๋อ นี่คือคำอธิบายโดยย่อเกี่ยวกับวิธีการของ คลาส ZipEntry , ZipInputStream   และZipOutputStream "

" ZipInputStreamเป็นสตรีม ดังนั้นZipEntry ทั้งหมด สามารถอ่านได้ตามลำดับเท่านั้น นี่คือวิธีการ:"

วิธี คำอธิบาย
ZipEntry getNextEntry() ส่งกลับวัตถุที่อธิบาย ZipEntry ถัดไป (ข้ามไบต์ทั้งหมดในรายการปัจจุบัน)
void closeEntry() ปิดสตรีมอินพุตใน ZipEntry ปัจจุบัน (ข้ามไบต์ทั้งหมดในรายการปัจจุบัน)
int available() ส่งคืน 1 มี ZipEntries มิฉะนั้นจะเป็น 0
int read(byte[] b, int off, int len) อ่านไบต์จาก ZipEntry ปัจจุบัน
long skip(long n) ข้าม n ไบต์เมื่ออ่านจากสตรีม
void close() ปิดสตรีม

"ไม่เข้าใจจริงๆ"

"สิ่งที่ดีที่สุดที่ควรทำคือจินตนาการว่าคุณกำลังอ่านไฟล์ข้อความ และ ZipEntries เป็นเหมือนบรรทัดในไฟล์ คุณสามารถอ่านข้อมูลจากบรรทัดปัจจุบัน ( ZipEntryปัจจุบัน) หรือข้ามจากบรรทัดหนึ่งไปอีกบรรทัด( getNextEntry , closeEntry ) "

"ฉันคิดว่าฉันเข้าใจ แต่ฉันไม่แน่ใจ"

"นี่คือ ZipOutputStream และวิธีการ:"

วิธี คำอธิบาย
void setComment(String comment) แสดงความคิดเห็นในไฟล์เก็บถาวร
void setMethod(int method) ตั้งค่าวิธีการบีบอัด (ประเภท)
void setLevel(int level) ตั้งค่าระดับการบีบอัด ยิ่งบีบอัดมากเท่าไหร่ก็ยิ่งช้าลงเท่านั้น
void putNextEntry(ZipEntry e) เพิ่ม ZipEntry ใหม่
void closeEntry() ปิด ZipEntry ปัจจุบัน
void write(byte[] b, int off, int len) เขียนชุดของไบต์ไปยัง ZipEntry ปัจจุบัน
void close() ปิดสตรีม

"แต่ในตัวอย่างด้านบน เราแทบจะไม่ใช้สิ่งนี้เลย"

"นี่เป็นวิธีทางเลือก คุณไม่จำเป็นต้องระบุระดับการบีบอัดและวิธีการ—จะใช้การตั้งค่าเริ่มต้น"

"อืม ก็ไม่เลวนะ แล้ว ZipEntry ล่ะ?"

"แน่นอน ข้อมูลอื่นๆ ใน ZipEntry คือข้อมูลการดูแลทำความสะอาด:"

วิธี คำอธิบาย
String getName(), setName(String) ไฟล์ชื่อภายใน
long getTime(), setTime(long) ครั้งล่าสุดที่มีการแก้ไขรายการ
long getCRC(), setCRC(long) ตรวจสอบผลรวม
long getSize(), setSize(long) ขนาดก่อนอัด.
int getMethod(), setMethod(int) วิธีการบีบอัด
long get/setCompressedSize() ขนาดหลังรูด.
boolean isDirectory() รายการเป็นไดเร็กทอรีหรือไม่

"นั่นดูไม่ยาก ไม่มีอะไรจะรัก!"

“เยี่ยมมาก แล้วดิเอโกก็จะมอบงานให้คุณในหัวข้อนี้เช่นกัน”

“ฉันควรจะปิดปากไว้”