Posted on 2007-09-26 10:31
云自無心水自閑 閱讀(4917)
評論(2) 編輯 收藏
網上介紹使用zipInStream和zipOutStream對文件或者文件夾進行壓縮和解壓縮的文章比較多。
但是這次項目中需要對byte[]進行壓縮,然后decode,通過http發送到服務端。
最簡單的方法,當然是把byte[]寫到文件里,然后根據網上已有的文章,生成fileInputStream,構造zipInStream。
但是這個做法有著明顯的問題,需要操作IO,在效率上不可取。
下面是利用ByteArrayOutStream來完成壓縮和解壓縮的代碼。
/**
* Answer a byte array compressed in the Zip format from bytes.
*
* @param bytes
* a byte array
* @param aName
* a String the represents a file name
* @return byte[] compressed bytes
* @throws IOException
*/
public static byte[] zipBytes(byte[] bytes) throws IOException {
ByteArrayOutputStream tempOStream = null;
BufferedOutputStream tempBOStream = null;
ZipOutputStream tempZStream = null;
ZipEntry tempEntry = null;
byte[] tempBytes = null;
tempOStream = new ByteArrayOutputStream(bytes.length);
tempBOStream = new BufferedOutputStream(tempOStream);
tempZStream = new ZipOutputStream(tempBOStream);
tempEntry = new ZipEntry(String.valueOf(bytes.length));
tempEntry.setMethod(ZipEntry.DEFLATED);
tempEntry.setSize((long) bytes.length);
tempZStream.putNextEntry(tempEntry);
tempZStream.write(bytes, 0, bytes.length);
tempZStream.flush();
tempBOStream.flush();
tempOStream.flush();
tempZStream.close();
tempBytes = tempOStream.toByteArray();
tempOStream.close();
tempBOStream.close();
return tempBytes;
}
/**
* Answer a byte array that has been decompressed from the Zip format.
*
* @param bytes
* a byte array of compressed bytes
* @return byte[] uncompressed bytes
* @throws IOException
*/
public static void unzipBytes(byte[] bytes, OutputStream os) throws IOException {
ByteArrayInputStream tempIStream = null;
BufferedInputStream tempBIStream = null;
ZipInputStream tempZIStream = null;
ZipEntry tempEntry = null;
long tempDecompressedSize = -1;
byte[] tempUncompressedBuf = null;
tempIStream = new ByteArrayInputStream(bytes, 0, bytes.length);
tempBIStream = new BufferedInputStream(tempIStream);
tempZIStream = new ZipInputStream(tempBIStream);
tempEntry = tempZIStream.getNextEntry();
if (tempEntry != null) {
tempDecompressedSize = tempEntry.getCompressedSize();
if (tempDecompressedSize < 0) {
tempDecompressedSize = Long.parseLong(tempEntry.getName());
}
int size = (int)tempDecompressedSize;
tempUncompressedBuf = new byte[size];
int num = 0, count = 0;
while ( true ) {
count = tempZIStream.read(tempUncompressedBuf, 0, size - num );
num += count;
os.write( tempUncompressedBuf, 0, count );
os.flush();
if ( num >= size ) break;
}
}
tempZIStream.close();
}