باستخدام هذه الطريقة ، يمكنك حزم الملفات على الفور ، ونقلها أثناء التغليف ، دون استخدام أي ذاكرة التخزين المؤقت ، مما يسمح للمستخدمين بالانتظار صفر!
نسخة الكود كما يلي:
/**
*
* مقبس عميل MySocket
* ملف param المجلد أو الملف ليتم تعبئته
* param filename اسم ملف التنزيل المعبأ
* throws ioException
*/
void down (ملف الملف ، اسم ملف السلسلة) يلقي ioException {
outputStream outputStream = mysocket.getOutputStream () ؛
StringBuffer SB = New StringBuffer ("HTTP/1.1 200 OK/R/N") ؛
sb.append ("الخادم: java/1.1/r/n") ؛
sb.append ("نوع المحتوى: التطبيق/stream ؛ charset = utf-8/r/n") ؛
//sb.append("user-agent: mozilla/4.0 (متوافق ؛ msie6.0 ؛ windows nt 5.0)/r/n ") ؛
SB.Append ("Disposition: Affectment ؛ filename =" + filename
+ "/r/n") ؛
sb.append ("ترميز النقل: chunked/r/n") ؛
sb.append ("الاتصال: keep-alive/r/n/r/n") ؛
outputStream.write (sb.toString (). getBytes ()) ؛
outputStream.flush () ؛
ZipCompressor ZipCompressor = new zipcompressor (new myoutputStream (
OutputStream)) ؛
zipcompressor.compress (ملف) ؛
System.out.println ("zip end") ؛
system.out.println ("اكتب '0 // r // n // r // n'") ؛
outputStream.write ("0/r/n/r/n" .getbytes ())
outputStream.flush () ؛
outputStream.Close () ؛
System.out.println ("Download Stop") ؛
يحاول {
mysocket.close () ؛
} catch (throwable t) {
}
}
نسخة الكود كما يلي:
حزمة CN.LiAngJintang.Webserver.zipfile ؛
استيراد java.io.bufferedInputStream ؛
استيراد java.io.file ؛
استيراد java.io.fileInputStream ؛
استيراد java.io.outputStream ؛
استيراد java.lang.reflect.field ؛
استيراد java.util.zip.crc32 ؛
استيراد java.util.zip.checkedOutputStream ؛
استيراد java.util.zip.zipentry ؛
استيراد java.util.zip.zipoutputStream ؛
الفئة العامة ZipCompressor {
Static Final Int Buffer = 8192 ؛
OutputStream OutputStream الخاص ؛
ZipCompressor العام (myoutputstream outputstream) {
this.outputStream = outputStream ؛
}
ضغط الفراغ العام (ملف الملف) {
if (! file.exists ())
رمي new RunTimeException (file.getabsolutepath () + "غير موجود!") ؛
يحاول {
checkedOutputStream cos = checkedOutputStream جديد (OutputStream ،
جديد CRC32 ()) ؛
ZipoutputStream Out = new zipoutputStream (cos) ؛
String riledir = "" ؛
ضغط (ملف ، Out ، riptireir) ؛
out.close () ؛ // يجب إغلاقه بحيث يتم كتابة المعلومات النهائية لـ ZIP ، وإلا فإن ملف الرمز البريدي سيكون غير مكتمل.
} catch (استثناء e) {
رمي new RunTimeException (e) ؛
}
}
ضغط void الخاص (ملف الملف ، ZipoutputStream Out ، سلسلة) {
// احكم على ما إذا كان دليلًا أو ملفًا
if (file.isdirectory ()) {
System.out.println ("Compression:" + riptir + file.getName ()) ؛
هذا.
} آخر {
System.out.println ("Compression:" + riptir + file.getName ()) ؛
هذا.
}
}
// ضغط الدليل
private void compressdirectory (ملف dir ، zipoutputstream out ، string riptire) {
إذا (! dir.exists ())
يعود؛
file [] files = dir.listfiles () ؛
لـ (int i = 0 ؛ i <files.length ؛ i ++) {
/** عودة*/
ضغط (ملفات [i] ، out ، ripendir + dir.getName () + "/") ؛
}
}
// ضغط ملف
private void compressfile (ملف الملف ، ZipoutputStream Out ، String riptiir) {
if (! file.exists ()) {
يعود؛
}
يحاول {
BufferedInputStream BIS = جديد BufferedInputStream (
FileInputStream جديد (ملف)) ؛
Zipentry Entry = new zipentry (ripendir + file.getName ()) ؛
out.putNextentry (الدخول) ؛
عدد int
بيانات البايت [] = بايت جديد [عازلة] ؛
بينما ((count = bis.read (البيانات ، 0 ، المخزن المؤقت))! = -1) {
out.write (البيانات ، 0 ، العد) ؛
}
bis.close () ؛
} catch (استثناء e) {
رمي new RunTimeException (e) ؛
}
}
}
نسخة الكود كما يلي:
حزمة CN.LiAngJintang.Webserver.zipfile ؛
استيراد java.io.filterOutputStream ؛
استيراد java.io.ioException ؛
استيراد java.io.outputStream ؛
الطبقة العامة myoutputstream يمتد filteroutputStream {
public myoutputStream (OutputStream) {
سوبر (خارج) ؛
}
البايت النهائي [] onebytes = "1/r/n" .getBytes () ؛
البايت النهائي [] rnbytes = "/r/n" .getBytes () ؛
الفراغ العام كتابة (int b) يلقي ioexception {
out.write (onebytes) ؛ // bytes 1+crlf
Out.write (B) ؛ // كيان البيانات
out.write (rnbytes) ؛ // crlf
}
public void write (byte [] b) يلقي ioexception {
Out.write (integer.toHexString (
out.write (rnbytes) ؛ // crlf
Out.write (B) ؛ // كيان البيانات
out.write (rnbytes) ؛ // crlf
}
باطلة عامة الكتابة (بايت [] B ، int Off ، int len) يلقي ioException {
out.write (integer.tohexstring (len - Off) .getBytes ()) ؛ // bytes ، hexadecimal
out.write (rnbytes) ؛ // crlf
out.write (B ، Off ، Len) ؛ // CHINTITY
out.write (rnbytes) ؛ // crlf
}
/**
* أعد كتابة هذه الطريقة ، وإلا سيتم إغلاق outputstream ، وبيانات أخرى <br/>
* (على سبيل المثال ، ترميز النقل: علامة نهاية الإرسال المكثفة) لم يعد بإمكانه الاستمرار في الكتابة
*/
إغلاق الفراغ العام () يلقي ioexception {
}
}