この方法を使用して、キャッシュを使用せずにパッケージを即座にパッケージ化し、パッケージング中に転送することができます。ユーザーがゼロを待つことができます。
コードコピーは次のとおりです。
/**
*
*マイソケットクライアントソケット
* @paramは、パッケージ化されるフォルダーまたはファイルをファイルします
* @param filenameパッケージダウンロードのファイル名
* @throws ioexception
*/
private void down(ファイルファイル、string filename)はioexceptionをスローします{
outputStream outputStream = mySocket.getOutputStream();
stringbuffer sb = new StringBuffer( "http/1.1 200 ok/r/n");
sb.append( "server:java/1.1/r/n");
sb.append( "content-type:application/octet-stream; charset = utf-8/r/n");
//sb.append("uuser-agent:mozilla/4.0(互換; msie6.0; windows nt 5.0)/r/n ");
sb.append( "content-disposition:attachment; filename =" + filename
+ "/r/n");
sb.append( "転送エンコード:チャンク/r/n");
Sb.Append( "Connection:Keep-Alive/r/n/r/n");
outputStream.write(sb.toString()。getBytes());
outputStream.flush();
ZipCompressor ZipCompressor = new ZipCompressor(新しいMyOutputStream(
outputStream));
zipcompressor.compress(file);
system.out.println( "zip end");
System.out.println( "write '0 // r // n // r // n'");
outputStream.write( "0/r/n/r/n" .getBytes()); //転送エンコード:チャンク送信エンドフラグ
outputStream.flush();
outputStream.close();
system.out.println( "ダウンロード停止");
試す {
mysocket.close();
} catch(スロー可能な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 {
静的最終INTバッファー= 8192;
private outputStream outputStream;
public zipcompressor(myoutputStream outputStream){
this.outputStream = outputStream;
}
public void Compress(ファイルファイル){
if(!file.exists())
新しいruntimeexception(file.getabsolutepath() + "not intable!");
試す {
CheckedOutputStream cos = new CheckedOutputStream(outputStream、
新しいcrc32());
zipoutputStream out = new ZipoutputStream(cos);
string basedir = "";
Compress(file、out、basedir);
out.close(); // zipの最終情報が書き込まれるように閉じている必要があります。そうしないと、zipファイルが執筆を続ける場合は、outputstream.close()メソッドを書き直すことができます。
} catch(例外e){
新しいruntimeexception(e);
}
}
private void Compress(ファイルファイル、zipoutputStream out、string basedir){
//ディレクトリかファイルかを判断します
if(file.isdirectory()){
system.out.println( "Compression:" + basedir + file.getName());
this.compressdirectory(file、out、basedir);
} それ以外 {
system.out.println( "Compression:" + basedir + file.getName());
this.compressfile(file、out、basedir);
}
}
//ディレクトリを圧縮します
private void compressdirectory(file dir、zipoutputstream out、string basedir){
if(!dir.exists())
戻る;
file [] files = dir.listfiles();
for(int i = 0; i <files.length; i ++){
/**再帰*/
compress(files [i]、out、basedir + dir.getname() + "/");
}
}
//ファイルを圧縮します
private void compressfile(ファイルファイル、zipoutputStream out、string basedir){
if(!file.exists()){
戻る;
}
試す {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
zipentry entry = new Zipentry(beasedir + file.getName());
out.putnextentry(entry);
int count;
バイトデータ[] = new byte [buffer];
while((count = bis.read(data、0、buffer))!= -1){
out.write(data、0、count);
}
bis.close();
} catch(例外e){
新しいruntimeexception(e);
}
}
}
コードコピーは次のとおりです。
パッケージcn.liangjintang.webserver.zipfile;
java.io.filteroutputStreamをインポートします。
java.io.ioexceptionをインポートします。
java.io.outputStreamをインポートします。
パブリッククラスMyOutputStream拡張FilterOutputStream {
public myoutputStream(outputStream out){
スーパー(out);
}
final byte [] onebytes = "1/r/n" .getBytes();
final byte [] rnbytes = "/r/n" .getBytes();
public void write(int b)throws ioexception {
out.write(onebytes); //バイト1+crlf
out.write(b); //データエンティティ
out.write(rnbytes); // crlf
}
public void write(byte [] b)はioexceptionをスローします{
out.write(integer.tohexstring(b.length).getbytes()); // bytes、hexadecimal
out.write(rnbytes); // crlf
out.write(b); //データエンティティ
out.write(rnbytes); // crlf
}
public void write(byte [] b、int off、int len)はioexceptionをスローします{
out.write(integer.tohexstring(len -off).getbytes()); // bytes、hexadecimal
out.write(rnbytes); // crlf
out.write(b、off、len); //データエンティティ
out.write(rnbytes); // crlf
}
/**
*この方法を書き直します。それ以外の場合は、outputStreamが閉じられ、他のデータ<br/>
*(たとえば、転送エンコード:チャンクされた伝送エンドフラグ)書き込みを続けることができません
*/
public void close()throws ioexception {
}
}