Используя этот метод, вы можете мгновенно упаковать файлы, перенести их во время упаковки, без использования какого -либо кэша, позволяя пользователям ждать нуля!
Кода -копия выглядит следующим образом:
/**
*
* MySocket Client Socket
* @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 ("Сервер: Java/1.1/R/N");
SB.Append ("Контент-тип: приложение/octet-stream; charset = utf-8/r/n");
//sb.append("user-agent: mozilla/4.0 (совместимый; msie6.0; Windows NT 5.0)/r/n ");
SB.Append ("Disposition: Attactment; filename =" + имя файла
+ "/r/n");
SB.Append ("Transfer-Encoding: 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 ("write '0 // r // n // r // n'");
outputStream.write ("0/r/n/r/n" .getbytes ()); // Передача:
outputStream.flush ();
outputStream.close ();
System.out.println ("Скачать остановку");
пытаться {
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 {
Статический конечный буфер int = 8192;
private outputStream outputStream;
public Zipcompressor (myoutputStream outputStream) {
this.outputStream = outputStream;
}
public void Compress (файл файла) {
if (! file.exists ())
бросить новое runtimeexception (file.getabsolutepath () + "не существует!");
пытаться {
CheckedOutputStream cos = newcedOutputStream (outputStream,
новый CRC32 ());
Zipoutputstream out = new ZipOutputStream (cos);
String foundir = "";
сжатие (файл, out, на основе);
out.close (); // Он должен быть закрыт, чтобы быть написанной конечной информацией ZIP, иначе файл ZIP будет неполным.
} catch (Exception e) {
бросить новое runtimeexception (e);
}
}
Private void Compress (файл файла, ZipOutputStream Out, String Foundir) {
// Судите, является ли это каталогом или файлом
if (file.isdirectory ()) {
System.out.println ("Compression:" + basedir + file.getName ());
это.
} еще {
System.out.println ("Compression:" + basedir + file.getName ());
этот.
}
}
// Сжатие каталога
private void compressDirectory (файл dir, zipoutputstream out, string foundir) {
if (! dir.exists ())
возвращаться;
File [] files = dir.listfiles ();
для (int i = 0; i <files.length; i ++) {
/** рекурсия*/
сжатие (файлы [i], out, basedir + dir.getName () + "/");
}
}
// Сжатие файла
Private void CompressFile (файл файл, ZipOutputStream Out, String Foundir) {
if (! file.exists ()) {
возвращаться;
}
пытаться {
BufferedInputStream bis = new BufferedInputStream (
new FileInputStream (файл));
Zipentry intry = new Zipentry (basedir + file.getName ());
out.putnextentry (inting);
int считать;
байтовые данные [] = новый байт [буфер];
while ((count = bis.read (data, 0, buffer))! = -1) {
out.write (data, 0, count);
}
bis.close ();
} catch (Exception e) {
бросить новое runtimeexception (e);
}
}
}
Кода -копия выглядит следующим образом:
Пакет cn.liangjintang.webserver.zipfile;
импортировать java.io.filteroutputstream;
импортировать java.io.ioexception;
импортировать java.io.outputstream;
открытый класс myoutputStream Extends filterOutputStream {
public myoutputstream (outputStream Out) {
супер (Out);
}
окончательный байт [] onebytes = "1/r/n" .getbytes ();
окончательный байт [] rnbytes = "/r/n" .getbytes ();
public void написать (int b) бросает ioException {
out.write (onebytes); // байты 1+crlf
out.write (b); // объект данных
out.write (rnbytes); // crlf
}
public void написать (byte [] b) бросает ioException {
out.write (integer.tohexstring (b.length) .getbytes ()); // байты, шестнадцатеричные
out.write (rnbytes); // crlf
out.write (b); // объект данных
out.write (rnbytes); // crlf
}
public void написать (byte [] b, int off, int len) бросает ioexception {
out.write (integer.tohexstring (len - off) .getbytes ()); // байты, шестнадцатеричные
out.write (rnbytes); // crlf
out.write (b, off, len); // объект данных
out.write (rnbytes); // crlf
}
/**
* Перепишите этот метод, в противном случае OutputStream будет закрыт, а другие данные <br/>
* (Например, кодирование передачи: флаг с коренным флагом передачи) не может продолжать писать
*/
public void cloid () бросает ioException {
}
}