Dengan menggunakan metode ini, Anda dapat mengemas file secara instan, mentransfernya saat kemasan, tanpa menggunakan cache apa pun, memungkinkan pengguna untuk menunggu nol!
Salinan kode adalah sebagai berikut:
/**
*
* soket klien mysocket
* @param file folder atau file yang akan dikemas
* @param fileName nama file dari unduhan yang dikemas
* @Throws IoException
*/
Private Void Down (File File, String FileName) melempar IoException {
OutputStream outputStream = mysocket.getoutputStream ();
StringBuffer SB = StringBuffer baru ("http/1.1 200 ok/r/n");
SB.Append ("Server: Java/1.1/r/n");
SB.Append ("tipe konten: aplikasi/oktet-stream; charset = UTF-8/r/n");
//sb.append("Aser-agent: mozilla/4.0 (kompatibel; msie6.0; windows nt 5.0)/r/n ");
SB.Append ("Disposisi Konten: Lampiran; FileName =" + nama file
+ "/r/n");
SB.Append ("Transfer-encoding: chunked/r/n");
SB.Append ("Koneksi: Keep-Alive/R/N/R/N");
outputStream.write (sb.tostring (). getBytes ());
outputStream.flush ();
Zipcompressor zipcompessor = zipcompressor baru (myoutputStream baru (
outputstream));
zipcompresser.compress (file);
System.out.println ("Zip End");
System.out.println ("tulis '0 // r // n // r // n'");
outputStream.write ("0/r/n/r/n" .getbytes ()); // transfer-encoding: bendera ujung transmisi chunked
outputStream.flush ();
outputStream.close ();
System.out.println ("Unduh Stop");
mencoba {
mysocket.close ();
} catch (Throwable t) {
}
}
Salinan kode adalah sebagai berikut:
paket cn.liangjintang.webserver.zipfile;
impor java.io.bufferedInputStream;
impor java.io.file;
impor java.io.fileInputStream;
impor java.io.outputStream;
impor java.lang.reflect.field;
impor java.util.zip.crc32;
impor java.util.zip.checkedoutputStream;
impor java.util.zip.zipentry;
impor java.util.zip.zipoutputStream;
Zipcompressor kelas publik {
Buffer int static final = 8192;
Private OutputStream OutputStream;
zipcompessor publik (myoutputStream outputStream) {
this.outputStream = outputStream;
}
public void compress (file file) {
if (! file.exists ())
Lempar runtimeException baru (file.getAbsolutePath () + "tidak ada!");
mencoba {
CheckedoutputStream cos = new checkedoutputStream (outputStream,
CRC32 baru ());
ZipoutputStream out = zipoutputStream baru (cos);
String berbasisr = "";
kompres (file, out, berbasis);
out.close (); // Itu harus ditutup sehingga informasi akhir ZIP akan ditulis, jika tidak file zip tidak akan lengkap.
} catch (Exception e) {
Lempar RuntimeException baru (E);
}
}
private void compress (file file, zipoutputstream out, string berbasis) {
// menilai apakah itu direktori atau file
if (file.isDirectory ()) {
System.out.println ("Compression:" + BasedIr + File.getName ());
ini.
} kalau tidak {
System.out.println ("Compression:" + BasedIr + File.getName ());
ini.
}
}
// Kompres direktori
private void compressDirectory (file dir, zipoutputstream out, string berbasis) {
if (! dir.exists ())
kembali;
File [] file = dir.listfiles ();
untuk (int i = 0; i <file.length; i ++) {
/** Rekursi*/
compress (file [i], out, berbasis + dir.getname () + "/");
}
}
// Kompres file
private void compressfile (file file, zipoutputStream out, string berbasis) {
if (! file.exists ()) {
kembali;
}
mencoba {
BufferedInputStream bis = baru bufferedInputStream (
FileInputStream baru (file));
Entri zipEntry = zipEntry baru (berbasis berbasis + file.getName ());
out.putNextEntry (entri);
jumlah int;
data byte [] = byte baru [buffer];
while ((count = bis.read (data, 0, buffer))! = -1) {
out.write (data, 0, count);
}
bis.close ();
} catch (Exception e) {
Lempar RuntimeException baru (E);
}
}
}
Salinan kode adalah sebagai berikut:
paket cn.liangjintang.webserver.zipfile;
impor java.io.filteroutputStream;
impor java.io.ioException;
impor java.io.outputStream;
kelas publik myoutputStream memperluas filteroutputStream {
public myoutputStream (outputStream out) {
super (keluar);
}
byte akhir [] oneBytes = "1/r/n" .getBytes ();
byte akhir [] rnbytes = "/r/n" .getBytes ();
public void write (int b) melempar ioException {
out.write (OneBytes); // bytes 1+crlf
out.write (b); // entitas data
out.write (rnbytes); // crlf
}
public void write (byte [] b) melempar ioException {
out.write (integer.tohexstring (b.length) .getbytes ()); // bytes, hexadecimal
out.write (rnbytes); // crlf
out.write (b); // entitas data
out.write (rnbytes); // crlf
}
public void write (byte [] b, int off, int len) melempar ioException {
out.write (integer.tohexstring (len - off) .getbytes ()); // byte, hexadecimal
out.write (rnbytes); // crlf
out.write (b, off, len); // entitas data
out.write (rnbytes); // crlf
}
/**
* Tulis ulang metode ini, jika tidak outputStream akan ditutup, dan data lainnya <br/>
* (Misalnya, pengkodean transfer: bendera ujung transmisi chunked) tidak dapat lagi terus menulis
*/
public void close () melempar ioException {
}
}