إذا كنت تستخدم مجموعة أدوات الضغط التي تأتي مع Java لتنفيذ وظيفة إلغاء ضغط الملفات إلى المجلد المحدد ، لأنه لا يمكن معالجة الرمز البريدي الذي توفره JDK إلا بتنسيق UTF-8 ، ويتم ترميز اسم الملف في نظام Windows في GBK ، لذا ، إذا كان ذلك هو إلغاء ضغط حزمة zip التي تحتوي على اسم الملف الصيني ، وسوف يبلغ عن استثناء معلمة غير قانوني. يتم تعديل 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 ؛
/**
* تنفذ هذه الفئة مرشح دفق الإخراج لضغط البيانات في
* تنسيق "انحراف".
* أنواع مرشحات الضغط ، مثل gzipoutputstream.
*
* seee deflater
* version 1.36 ، 03/13/06
* Author David Connelly
*/
عام
فئة deflateroutputstream يمتد filterOutputStream {
/**
* ضاغط لهذا التيار.
*/
محمية deflater def ؛
/**
* الإخراج العازلة لكتابة البيانات المضغوطة.
*/
بايت محمي [] buf ؛
/**
* يشير إلى أن الدفق قد تم إغلاقه.
*/
مغلق منطقي خاص = خطأ ؛
/**
* ينشئ دفق إخراج جديد مع الضاغط المحدد و
* حجم المخزن المؤقت.
* param خارج دفق الإخراج
* Param Def the Laversor ("Deflater")
* حجم param حجم المخزن المؤقت الإخراج
* exception alfictalargumentException إذا كان الحجم <= 0
*/
Public DeflaterOutputStream (OutputStream ، deflater def ، int size) {
سوبر (خارج) ؛
if (out == null || def == null) {
رمي nullpointerxception () جديدة ؛
} آخر إذا (الحجم <= 0) {
رمي جديد غير unalfalArgumentException ("حجم المخزن المؤقت <= 0") ؛
}
this.def = def ؛
buf = new byte [size] ؛
}
/**
* ينشئ دفق إخراج جديد مع الضاغط المحدد و
* حجم المخزن المؤقت الافتراضي.
* param خارج دفق الإخراج
* Param Def the Laversor ("Deflater")
*/
Public DeflaterOutputStream (OutputStream Out ، deflater def) {
هذا (خارج ، def ، 512) ؛
}
Boolean usedefaultdeflater = false ؛
/**
* ينشئ دفق إخراج جديد مع ضاغط افتراضي وحجم المخزن المؤقت.
* param خارج دفق الإخراج
*/
public deflateroutputstream (OutputStream Out) {
هذا (خارج ، new deflater ()) ؛
useDefaultDeflater = true ؛
}
/**
* يكتب بايت لتيار الإخراج المضغوط
* كتلة حتى يمكن كتابة البايت.
* param b البايت المراد كتابته
* exception ioException إذا حدث خطأ I/O
*/
الفراغ العام كتابة (int b) يلقي ioexception {
Byte [] buf = new byte [1] ؛
buf [0] = (byte) (b & 0xff) ؛
اكتب (buf ، 0 ، 1) ؛
}
/**
* يكتب مجموعة من البايتات إلى دفق الإخراج المضغوط
* سيتم حظر الطريقة حتى يتم كتابة جميع البايتات.
* param b البيانات المراد كتابة
* param قبالة إزاحة بدء البيانات
* param len طول البيانات
* exception ioException إذا حدث خطأ I/O
*/
باطلة عامة الكتابة (بايت [] B ، int Off ، int len) يلقي ioException {
if (def.finished ()) {
رمي ioException جديد ("اكتب ما وراء نهاية الدفق") ؛
}
if ((OFF | LEN | (OFF + LEN) | (B.Length - (OFF + LEN))) <0) {
رمي indexoutofboundsexception () ؛
} آخر إذا (len == 0) {
يعود؛
}
if (! def.finished ()) {
// لا يتجنب أكثر من بايت في وقت واحد
// نسخ فائض في diflatebytes (انظر deflater.c)
int stride = buf.length ؛
لـ (int i = 0 ؛ i <len ؛ i+= stride) {
Def.SetInput (B ، Off + I ، Math.min (Stride ، Len - I)) ؛
بينما (! def.needsinput ()) {
deplate () ؛
}
}
}
}
/**
* ينتهي من كتابة البيانات المضغوطة إلى دفق الإخراج دون الإغلاق
* الدفق الأساسي.
* في الخلافة لنفس دفق الإخراج.
* exception ioException إذا حدث خطأ I/O
*/
Public Void Finish () يلقي ioexception {
if (! def.finished ()) {
def.finish () ؛
بينما (! def.finished ()) {
deplate () ؛
}
}
}
/**
* يكتب البيانات المضغوطة المتبقية إلى دفق الإخراج ويغلق
* الدفق الأساسي.
* exception ioException إذا حدث خطأ I/O
*/
إغلاق الفراغ العام () يلقي ioexception {
إذا (! مغلق) {
ينهي()؛
إذا (useDefaultDeflater)
def.end () ؛
out.close () ؛
مغلق = صحيح ؛
}
}
/**
* يكتب الكتلة التالية من البيانات المضغوطة إلى دفق الإخراج.
* Throws ioException في حالة حدوث خطأ I/O
*/
diflate void المحمية () يلقي ioException {
int len = def.deflate (buf ، 0 ، buf.length) ؛
if (len> 0) {
out.write (buf ، 0 ، len) ؛
}
}
}