หากคุณใช้ชุดเครื่องมือการบีบอัดที่มาพร้อมกับ Java เพื่อใช้ฟังก์ชั่นของการบีบอัดไฟล์ไปยังโฟลเดอร์ที่ระบุเนื่องจาก ZIP ที่จัดทำโดย JDK สามารถประมวลผลได้ในรูปแบบ UTF-8 เท่านั้นและชื่อไฟล์ในระบบ Windows จะถูกเข้ารหัสใน GBK เท่านั้น ดังนั้นหากมันคือการคลายซิปแพ็คเกจซิปที่มีชื่อไฟล์ภาษาจีนและจะรายงานข้อยกเว้นพารามิเตอร์ที่ผิดกฎหมาย Java และ ZipOutputStream.java
ตั้งแต่ J2SE 1.4 คอมไพเลอร์ Java ไม่รองรับการนำเข้าคลาสหรืออินเทอร์เฟซสำหรับชื่อแพ็คเกจที่ไม่มีชื่ออีกต่อไปดังนั้นในโครงการ Java ที่คุณสร้างขึ้นคุณต้องสร้างแพ็คเกจใหม่ที่คุณกำหนดเอง ของชื่อโดเมนโรงเรียน +ชื่อเครือข่ายของตัวเองเช่น cn.edu.xidian.crytoll
สร้างคลาส deflaterOutputStream ใหม่ในแพ็คเกจรหัสมีดังนี้:
deflaterOutputStream.java:
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ cn.edu.xdian.crytoll;
นำเข้า java.io.filterOutputStream;
นำเข้า java.io.ioException;
นำเข้า Java.io.OutputStream;
นำเข้า java.util.zip.deflater;
-
* คลาสนี้ใช้ตัวกรองสตรีมเอาต์พุตสำหรับการบีบอัดข้อมูลใน
* รูปแบบการบีบอัด "deflate"
* ประเภทของตัวกรองการบีบอัดเช่น GZIPOUTPUTSTREAM
-
* @see deflater
* @version 1.36, 03/13/06
* @author David Connelly
-
สาธารณะ
คลาส deflaterOutputStream ขยาย FilterOutputStream {
-
* คอมเพรสเซอร์สำหรับสตรีมนี้
-
ป้องกัน deflater def;
-
* บัฟเฟอร์เอาท์พุทสำหรับการเขียนข้อมูลที่ถูกบีบอัด
-
ไบต์ที่ได้รับการปกป้อง [] buf;
-
* ระบุว่าสตรีมถูกปิด
-
บูลีนส่วนตัวปิด = เท็จ;
-
* สร้างสตรีมเอาต์พุตใหม่ด้วยคอมเพรสเซอร์ที่ระบุและ
* ขนาดบัฟเฟอร์
* @param ออกกระแสเอาต์พุต
* @param def the compressor ("deflater")
* @param ขนาดขนาดบัฟเฟอร์เอาต์พุต
* @Exception unlueLArgumentException ถ้าขนาดคือ <= 0
-
Public DeflaterOutputStream (OutputStream, deflater def, ขนาด int) {
super (ออก);
if (out == null || def == null) {
โยน nullpointerexception ใหม่ ();
} อื่นถ้า (ขนาด <= 0) {
โยน unlegalargumentException ใหม่ ("ขนาดบัฟเฟอร์ <= 0");
-
this.def = def;
buf = ไบต์ใหม่ [ขนาด];
-
-
* สร้างสตรีมเอาต์พุตใหม่ด้วยคอมเพรสเซอร์ที่ระบุและ
* ขนาดบัฟเฟอร์เริ่มต้น
* @param ออกกระแสเอาต์พุต
* @param def the compressor ("deflater")
-
Public DeflaterOutputStream (OutputStream, deflater def) {
สิ่งนี้ (ออก, def, 512);
-
บูลีนใช้ DEFAULTDEFLATER = FALSE;
-
* สร้างสตรีมเอาต์พุตใหม่ด้วยคอมเพรสเซอร์เริ่มต้นและขนาดบัฟเฟอร์
* @param ออกกระแสเอาต์พุต
-
Public DeflaterOutputStream (OutputStream) {
สิ่งนี้ (ออก, deflater ใหม่ ());
ใช้ defaultDeflater = true;
-
-
* เขียนไบต์ไปยังสตรีมเอาต์พุตที่บีบอัด
* บล็อกจนกว่าจะสามารถเขียนไบต์
* @param b ไบต์ที่จะเขียน
* @Exception iOexception หากเกิดข้อผิดพลาด I/O
-
โมฆะสาธารณะเขียน (int b) โยน ioexception {
ไบต์ [] buf = ไบต์ใหม่ [1];
buf [0] = (ไบต์) (b & 0xff);
เขียน (buf, 0, 1);
-
-
* เขียนอาร์เรย์ของไบต์ไปยังสตรีมเอาต์พุตที่บีบอัด
* วิธีการจะบล็อกจนกว่าจะมีการเขียนไบต์ทั้งหมด
* @param b ข้อมูลที่จะเขียน
* @param ปิดการชดเชยเริ่มต้นของข้อมูล
* @param len ความยาวของข้อมูล
* @Exception iOexception หากเกิดข้อผิดพลาด I/O
-
โมฆะสาธารณะเขียน (ไบต์ [] b, int ปิด, int len) โยน ioexception {
if (def.finished ()) {
โยน iOexception ใหม่ ("เขียนเกินกว่าจุดสิ้นสุดของสตรีม");
-
if ((ปิด | len | (ปิด + len) | (b.length - (ปิด + len))) <0) {
โยน indexoutofboundsexception ใหม่ ();
} อื่นถ้า (len == 0) {
กลับ;
-
ถ้า (! def.finished ()) {
// ยุบตัวไม่มากไปกว่า Bytes ในแต่ละครั้ง
// การคัดลอกส่วนเกินใน deflateBytes (ดู deflater.c)
int stride = buf.length;
สำหรับ (int i = 0; i <len; i+= stride) {
def.setInput (b, ปิด + i, math.min (stride, len - i));
ในขณะที่ (! def.needsInput ()) {
ยุบ();
-
-
-
-
-
* เสร็จสิ้นการเขียนข้อมูลที่ถูกบีบอัดไปยังกระแสเอาต์พุตโดยไม่ต้องปิด
* สตรีมพื้นฐานใช้วิธีนี้เมื่อใช้ตัวกรองหลายตัว
* ติดต่อกับกระแสเอาต์พุตเดียวกัน
* @Exception iOexception หากเกิดข้อผิดพลาด I/O
-
Public Void Finish () พ่น IOException {
ถ้า (! def.finished ()) {
def.finish ();
ในขณะที่ (! def.finished ()) {
ยุบ();
-
-
-
-
* เขียนข้อมูลบีบอัดที่เหลือลงในกระแสเอาต์พุตและปิดไฟล์
* สตรีมพื้นฐาน
* @Exception iOexception หากเกิดข้อผิดพลาด I/O
-
Public Void Close () พ่น IOException {
ถ้า (ปิด) {
เสร็จ();
if (useDefaultDeflater)
ปกป้อง();
out.close ();
ปิด = จริง;
-
-
-
* เขียนบล็อกถัดไปของข้อมูลบีบอัดไปยังสตรีมเอาต์พุต
* @throws ioexception หากเกิดข้อผิดพลาด I/O
-
void protected deflate () พ่น ioexception {
int len = def.deflate (buf, 0, buf.length);
ถ้า (len> 0) {
out.write (buf, 0, len);
-
-
-