Java ใช้ฟังก์ชั่นการบีบอัดของซิปและฟังก์ชั่นการบีบอัดโดยทั่วไปใช้โพลีเปปไทด์และเทคโนโลยีการเรียกซ้ำของ Java ซึ่งสามารถบีบอัดและบีบอัดไฟล์แต่ละไฟล์และโฟลเดอร์แบบเรียงซ้อนซึ่งเป็นตัวอย่างที่ดีมากสำหรับผู้เริ่มต้น
Zip มีบทบาทสองบทบาท: การเก็บถาวรและการบีบอัด; GZIP ไม่ได้เก็บไฟล์ แต่จะบีบอัดไฟล์เดียวเท่านั้น ดังนั้นบนแพลตฟอร์ม UNIX คำสั่ง TAR มักจะใช้เพื่อสร้างไฟล์เก็บถาวรจากนั้นสั่ง GZIP เพื่อบีบอัดไฟล์เก็บถาวร
ไลบรารีคลาส Java I/O ยังมีบางคลาสที่สามารถอ่านและเขียนสตรีมรูปแบบการบีบอัดได้ เพื่อให้ฟังก์ชั่นการบีบอัดเพียงห่อไว้นอกคลาส I/O ที่มีอยู่ คลาสเหล่านี้ไม่ใช่ผู้อ่านและนักเขียน แต่เป็นคลาสย่อยของ InputStream และ Outstreamput นี่เป็นเพราะอัลกอริทึมการบีบอัดถูกกำหนดเป้าหมายที่ไบต์มากกว่าตัวละคร
คลาสและอินเทอร์เฟซที่เกี่ยวข้อง:
Checksum Interface: อินเทอร์เฟซที่ใช้โดยคลาส ADLER32 และ CRC32
Adler32: ใช้อัลกอริทึม Alder32 เพื่อคำนวณจำนวนการตรวจสอบ
CRC32: ใช้อัลกอริทึม CRC32 เพื่อคำนวณจำนวนการตรวจสอบ
CheckedInputStream: คลาสที่ได้รับอินพุตคุณสามารถรับการตรวจสอบของสตรีมอินพุตซึ่งใช้เพื่อตรวจสอบความสมบูรณ์ของข้อมูล
CheckedOutputStream: คลาสที่ได้รับ OutputStream คุณสามารถรับการตรวจสอบของสตรีมเอาต์พุตที่ใช้เพื่อตรวจสอบความสมบูรณ์ของข้อมูล
deflaterOutputStream: คลาสพื้นฐานของคลาสบีบอัด
ZipOutputStream: คลาสย่อยของ deflaterOutputStream ที่บีบอัดข้อมูลลงในรูปแบบไฟล์ ZIP
gzipoutputStream: คลาสย่อยของ deflateroutputStream ที่บีบอัดข้อมูลลงในรูปแบบไฟล์ gzip
InflaterInputStream: คลาสพื้นฐานสำหรับการบีบอัด
ZipInputStream: คลาสย่อยของ InflaterInputStream ซึ่งสามารถคลายข้อมูลรูปแบบ ZIP ได้
gzipinputstream: คลาสย่อยของ inflerInputStream ซึ่งสามารถคลายข้อมูลรูปแบบ ZIP
คลาส Zipentry: แสดงรายการไฟล์ zip
คลาส ZipFile: คลาสนี้ใช้เพื่ออ่านรายการจากไฟล์ ZIP
ใช้ zip เพื่อบีบอัดและคลายหลายไฟล์
Java รองรับไลบรารีรูปแบบ ZIP ในวิธีที่ค่อนข้างครอบคลุมและจำเป็นต้องใช้มันเพื่อบีบอัดไฟล์หลายไฟล์ลงในแพ็คเกจบีบอัด ไลบรารีคลาสนี้ใช้รูปแบบ zip มาตรฐานดังนั้นจึงเข้ากันได้กับเครื่องมือบีบอัดจำนวนมาก
คลาส ZipOutputStream มีชุดวิธีการบีบอัดและระดับการบีบอัดที่ใช้ในวิธีการบีบอัด ZipOutputStream.SetMethod (Int Method) ตั้งค่าวิธีการบีบอัดเริ่มต้นที่ใช้สำหรับรายการ ตราบใดที่ไม่มีการระบุวิธีการบีบอัดสำหรับรายการไฟล์ zip เดียววิธีการบีบอัดที่กำหนดโดย ZipOutputStream จะถูกเก็บไว้ ค่าเริ่มต้นคือ zipoutputStream.deflated (ระบุที่เก็บข้อมูลการบีบอัด) และยังสามารถตั้งค่าเป็นที่เก็บไว้ (ระบุเฉพาะที่เก็บเก็บถาวรบรรจุภัณฑ์) หลังจาก zipoutputStream ได้ตั้งค่าวิธีการบีบอัดเป็น deflated เราสามารถใช้วิธีการตั้งระดับ (ระดับ int) เพิ่มเติมเพื่อตั้งค่าระดับการบีบอัด ค่าระดับการบีบอัดคือ 0-9 โดยมีระดับรวม 10 ระดับ (ยิ่งมีค่ามากเท่าไหร่ก็ยิ่งมีโอกาสมากขึ้นเท่านั้นที่จะบีบอัด) ค่าเริ่มต้นคือ deflater.default_compression = -1 แน่นอนเรายังสามารถตั้งค่าวิธีการบีบอัดสำหรับเงื่อนไขเดียวผ่านวิธี setMethod ของรายการ zipentry
คลาส Zipentry อธิบายไฟล์บีบอัดที่เก็บไว้ในไฟล์ zip คลาสมีหลายวิธีในการตั้งค่าและรับข้อมูลเกี่ยวกับรายการไปรษณีย์ คลาส zipentry ใช้โดย zipfile [zipfile.getInputStream (รายการ zipentry)] และ zipinputstream เพื่ออ่านไฟล์ zip และ zipoutputstream เพื่อเขียนลงในไฟล์ zip มีวิธีการที่มีประโยชน์บางอย่าง: getName () ส่งคืนชื่อรายการ, isDirectory () ส่งคืนจริงถ้ามันเป็นรายการไดเรกทอรี (รายการไดเรกทอรีถูกกำหนดเป็นรายการที่มีชื่อจบด้วย '/'), setMethod (int method) ตั้งค่าวิธีการบีบอัดสำหรับรายการ
ในตัวอย่างต่อไปนี้เราใช้ชุดเครื่องมือ Apache zip (แพ็คเกจเป็น ant.jar) เนื่องจากประเภท Java มาพร้อมกับมันไม่รองรับเส้นทางจีน แต่ทั้งสองใช้ในลักษณะเดียวกัน แต่เครื่องมือการบีบอัด Apache มีอินเทอร์เฟซมากขึ้นในการตั้งค่าวิธีการเข้ารหัส นอกจากนี้หากคุณใช้ org.apache.tools.zip.zipoutputstream เพื่อบีบอัดเราสามารถใช้ org.apache.tools.zip.zipentry เพื่อคลายการบีบอัดและไม่สามารถใช้ java.util.zip.zipinputstream เพื่อคลายและอ่าน แน่นอน Apache ไม่ได้ให้คลาส ZipInputStream
การบีบอัดไฟล์:
แพ็คเกจ gizaction; นำเข้า java.io. *; นำเข้า java.util.zip. *;/** * @author dana ・ li * <p> * โปรแกรมใช้การบีบอัดซิป [การบีบอัด] * <p> * ฟังก์ชั่นทั่วไปรวมถึงการใช้ polymorphism พา ธ อินพุตต้นทางและเส้นทางเอาต์พุตเป้าหมายต้องปรับแต่งในรหัส * <p> * ในส่วนของรหัสนี้ส่วนการบีบอัดจะถูกนำไปใช้ */คลาสสาธารณะ zipcompressing {ส่วนตัว int k = 1; // กำหนดตัวแปรหมายเลขซ้ำโมฆะ zip ส่วนตัว (สตริง zipfilename, file inputfile) โยนข้อยกเว้น {system.out.println ("การบีบอัด ... "); zipoutputStream out = new ZipOutputStream (ใหม่ fileOutputStream (zipfilename)); BufferedOutputStream BO = ใหม่ bufferedOutputStream (out); zip (out, inputfile, inputfile.getName (), bo); bo.close (); out.close (); // output stream close system.out.println ("การบีบอัดเสร็จสมบูรณ์"); } private void zip (zipoutputstream out, ไฟล์ f, ฐานสตริง, bufferedoutputstream bo) โยนข้อยกเว้น {// เมธอดโอเวอร์โหลดถ้า (f.isdirectory ()) {ไฟล์ [] fl = f.listfiles (); if (fl.length == 0) {out.putNextEntry (zipentry ใหม่ (ฐาน + "/")); // สร้างจุดเริ่มต้นของจุดบีบอัด ZIP System.out.println (ฐาน + "/"); } สำหรับ (int i = 0; i <fl.length; i ++) {zip (out, fl [i], base + "/" + fl [i] .getName (), bo); // traverse subfolders ซ้ำ} system.out.println ("th" + k + "ย่อยย่อย"); K ++; } else {out.putnextentry (zipentry ใหม่ (ฐาน)); // สร้างจุดเริ่มต้นของจุดบีบอัด zip system.out.println (ฐาน); FileInputStream ใน = ใหม่ FileInputStream (F); bufferedInputStream bi = ใหม่ bufferedInputStream (IN); int b; ในขณะที่ ((b = bi.read ())! = -1) {bo.write (b); // เขียนสตรีมไบต์ไปยังไดเรกทอรี zip ปัจจุบัน} bi.close (); in.close (); // อินพุตสตรีมปิด}}/ *** ทดสอบ* @param args*/ โมฆะคงที่สาธารณะหลัก (สตริง [] args) {zipcompressing book = new ZipCompressing (); ลอง {book.zip ("f: //ziptest.zip", ไฟล์ใหม่ ("f: // ziptest")); } catch (exception e) {e.printstacktrace (); -การบีบอัดไฟล์:
แพ็คเกจ gizaction; นำเข้า java.io.bufferedInputStream; นำเข้า java.io.bufferedOutputStream นำเข้า java.io.file; นำเข้า java.io.fileinputstream นำเข้า java.io.filenotfoundException; java.util.zip.zipinputstream;/** * @author dana ・ li * <p> * โปรแกรมใช้ Zip Decompression [การบีบอัด] * <p> * ฟังก์ชั่นทั่วไปรวมถึงการใช้ polymorphic พา ธ อินพุตต้นทางและเส้นทางเอาต์พุตเป้าหมายต้องปรับแต่งในรหัส * <p> * ในรหัสนี้ส่วนการบีบอัดจะถูกนำไปใช้; */ คลาสสาธารณะ zipdecompressing {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// วิธีการที่สร้างขึ้นอัตโนมัติ toDo stub starttime long starttime = system.currentTimeMillis (); ลอง {zipinputStream zin = new ZipInputStream (ใหม่ FileInputStream ("f: //ziptest.zip")); // แหล่งที่มา zip path path bufferedInputStream bin = new BufferedInputStream (zin); String parent = "f: // ziptest //"; // พาพุทเส้นทาง (ไดเรกทอรีโฟลเดอร์) ไฟล์ fout = null; รายการ Zipentry; ลอง {ในขณะที่ ((entry = zin.getnextentry ())! = null &&! entry.isdirectory ()) {fout = ไฟล์ใหม่ (parent, entry.getName ()); if (! fout.exists ()) {(ไฟล์ใหม่ (fout.getParent ())). mkdirs (); } fileOutputStream out = new fileOutputStream (fout); bufferedOutputStream bout = new bufferedOutputStream (out); int b; ในขณะที่ ((b = bin.read ())! =-1) {bout.write (b); } bout.close (); out.close (); System.out.println (fout+"การบีบอัดสำเร็จ"); } bin.close (); zin.close (); } catch (ioexception e) {e.printstacktrace (); }} catch (filenotfoundException e) {e.printStackTrace (); } endtime long = system.currentTimeMillis (); System.out.println ("ใช้เวลานาน:"+(endtime-starttime)+"MS"); -การบีบอัดไฟล์เดียวด้วย GZIP
อินเทอร์เฟซของ GZIP นั้นค่อนข้างง่ายดังนั้นหากคุณต้องการบีบอัดสตรีมเท่านั้นคุณสามารถใช้งานได้ แน่นอนว่ามันสามารถบีบอัดสตรีมอักขระและบีบอัดไบต์ไบต์ ด้านล่างเป็นไฟล์ข้อความที่บีบอัดรูปแบบการเข้ารหัส GBK
การใช้คลาสการบีบอัดนั้นง่ายมาก เพียงใช้ GZIPOUTPUTSTREAM หรือ ZIPOUTPUTSTREAM เพื่อห่อกระแสเอาต์พุตจากนั้นใช้ GZIPINPUTSTREAM หรือ ZIPINPUTSTREAM เพื่อห่อสตรีมอินพุต ส่วนที่เหลือคือการดำเนินการ I/O ธรรมดา
นำเข้า java.io.bufferedOutputStream; นำเข้า java.io.bufferedreader; นำเข้า java.io.fileinputstream; นำเข้า java.io.fileoutputstream; นำเข้า java.io.ioexception; นำเข้า java.io.inputstreamreader; java.util.zip.gzipoutputstream; คลาสสาธารณะ gzipcompress {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น IOException {// เตรียมที่จะบีบอัดไฟล์อักขระ โปรดทราบว่าไฟล์อักขระที่นี่คือ GBK เข้ารหัส bufferedReader ใน = new bufferedReader (ใหม่ inputStreamReader (ใหม่ FileInputStream ("E: /tmp/source.txt"), "GBK")); // ใช้ gzipoutputstream เพื่อห่อกระแส outputstream เพื่อสร้างลักษณะการบีบอัดที่เฉพาะเจาะจงและในที่สุดแพ็คเกจการบีบอัด tet.txt.gz จะถูกสร้างขึ้น // และมีไฟล์ที่ชื่อ test.txt อยู่ System.out.println ("เริ่มเขียนไฟล์บีบอัด ... "); int c; ในขณะที่ ((c = in.read ())! = -1) { / * * หมายเหตุนี่คือไฟล์อักขระที่อ่านในสตรีมอักขระและ C ไม่สามารถเก็บไว้ได้โดยตรงเนื่องจาก C เป็นรหัส Unicode * ซึ่งจะสูญเสียข้อมูล (แน่นอนรูปแบบการเข้ารหัสนั้นผิด) ดังนั้นจึงต้องแก้ไขด้วย GBK */ out.write (string.valueof ((char) c) .getBytes ("GBK")); } in.close (); out.close (); System.out.println ("เริ่มอ่านไฟล์บีบอัด ... "); // ใช้ gzipinputStream เพื่อห่อสตรีมอินพุตเพื่อทำให้บัฟเฟอร์บัฟเฟอร์การบีบอัด in2 = ใหม่ bufferedReader (ใหม่ inputStreamReader (ใหม่ gzipinputStream (ใหม่ fileInputStream ("test.txt.gz")), "GBK"); สตริง s; // อ่านเนื้อหาในไฟล์บีบอัดในขณะที่ ((s = in2.readline ())! = null) {system.out.println (s); } in2.close (); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น