Usando esse método, você pode embalar arquivos instantaneamente, transferi -los durante a embalagem, sem usar qualquer cache, permitindo que os usuários esperem zero!
A cópia do código é a seguinte:
/**
*
* MySocket Client Socket
* @param arquivo a pasta ou arquivo a ser embalado
* @param filename O nome do arquivo do download embalado
* @THOWSows IoException
*/
private void Down (arquivo de arquivo, nome do arquivo de string) lança ioexception {
OutputStream outputStream = mysocket.getOutputStream ();
StringBuffer sb = new StringBuffer ("http/1.1 200 ok/r/n");
sb.append ("servidor: java/1.1/r/n");
SB.Append ("Content-Type: Application/Octet-Stream; Charset = UTF-8/R/N");
//sb.append("User-AGENT: Mozilla/4.0 (compatível; msie6.0; Windows nt 5.0)/r/n ");
sb.append ("Content-Disposição: anexo; nome do arquivo =" + nome do arquivo
+ "/r/n");
sb.append ("codificação de transferência: rolada/r/n");
sb.append ("Conexão: Keep-Alive/R/N/R/N");
outputStream.Write (sb.toString (). getBytes ());
outputStream.flush ();
ZipCompressor zipCompressor = new ZipCompressor (new MyOutputStream (
outputStream));
zipCompressor.comPress (arquivo);
System.out.println ("end end");
System.out.println ("write '0 // r // n // r // n'");
outputStream.Write ("0/r/n/r/n" .getbytes ()); // codificação de transferência: bandeira de transmissão em troca
outputStream.flush ();
outputStream.Close ();
System.out.println ("Download Stop");
tentar {
mysocket.close ();
} catch (throwable t) {
}
}
A cópia do código é a seguinte:
pacote cn.liangjintang.webserver.zipfile;
importar java.io.bufferInputStream;
importar java.io.file;
importar java.io.fileInputStream;
importar java.io.OutputStream;
importar java.lang.reflect.field;
importar java.util.zip.crc32;
importar java.util.zip.checkedOutputStream;
importar java.util.zip.zipentry;
importar java.util.zip.zipOutputStream;
classe pública ZipCompressor {
estático final int buffer = 8192;
output private OutputStream;
public ZipCompressor (MyOutputStream OutputStream) {
this.OutputStream = outputStream;
}
public void Compress (arquivo de arquivo) {
if (! file.exists ())
lançar a nova RunTimeException (file.getabsolutepath () + "não existe!");
tentar {
CheckedOutputStream cos = new CheckedOutputStream (O outputStream,
novo Crc32 ());
ZipOutputStream Out = new ZipOutputStream (COS);
String baseado = "";
compactar (arquivo, out, baseado);
out.Close (); // Deve ser fechado para que as informações finais do ZIP sejam gravadas, caso contrário, o arquivo zip ficará incompleto.
} catch (Exceção e) {
lançar nova execução de tempo de execução (e);
}
}
Compressa de void privado (arquivo de arquivo, zipOutputStream Out, String baseado) {
// julga se é um diretório ou um arquivo
if (file.isdirectory ()) {
System.out.println ("compactação:" + baseado + file.getName ());
this.comPressDirectory (arquivo, out, baseado);
} outro {
System.out.println ("compactação:" + baseado + file.getName ());
this.compressfile (arquivo, out, baseado);
}
}
// compactar um diretório
private void compressdirectory (Arquivo Dir, ZipOutputStream Out, String baseado) {
if (! Dir.Exists ())
retornar;
Arquivo [] arquivos = dir.ListFiles ();
for (int i = 0; i <files.length; i ++) {
/** Recursão*/
compactar (arquivos [i], out, basearir + dir.getName () + "/");
}
}
// compactar um arquivo
private void compressfile (arquivo de arquivo, zipoutputStream Out, string baseado) {
if (! file.exists ()) {
retornar;
}
tentar {
BufferInputStream bis = new bufferInputStream (
new FileInputStream (File));
Entrada zipentry = new Zipentry (baseado + file.getName ());
out.putNextEntry (entrada);
int contagem;
byte dados [] = novo byte [buffer];
while ((count = bis.read (dados, 0, buffer))! = -1) {
out.write (dados, 0, contagem);
}
bis.close ();
} catch (Exceção e) {
lançar nova execução de tempo de execução (e);
}
}
}
A cópia do código é a seguinte:
pacote cn.liangjintang.webserver.zipfile;
importar java.io.FilterOutputStream;
importar java.io.ioException;
importar java.io.OutputStream;
classe pública MyOutputStream estende o filtroLoutputStream {
public myoutputStream (outputStream Out) {
super (fora);
}
Byte final [] OneBytes = "1/R/N" .GetBytes ();
Final byte [] rnbytes = "/r/n" .getBytes ();
public void write (int b) lança ioexception {
out.Write (OneBytes); // bytes 1+Crlf
out.write (b); // entidade de dados
out.write (rnbytes); // crlf
}
public void write (byte [] b) lança ioexception {
out.Write (Integer.ToHexString (B.Length) .GetBytes ()); // bytes, hexadecimal
out.write (rnbytes); // crlf
out.write (b); // entidade de dados
out.write (rnbytes); // crlf
}
public void Write (byte [] b, int off, int len) lança ioexception {
out.Write (Integer.ToHexString (Len - Off) .GetBytes ()); // bytes, hexadecimal
out.write (rnbytes); // crlf
out.write (b, off, len); // entidade de dados
out.write (rnbytes); // crlf
}
/**
* Reescreva esse método, caso contrário, o outputStream será fechado e outros dados <br/>
* (Por exemplo, codificação de transferência: bandeira final de transmissão em chunk) não pode mais continuar escrevendo
*/
public void Close () lança ioexception {
}
}