网上介绍使用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();
}