参考:http://www.blogjava.net/usherlight/archive/2007/09/26/148230.html
网上介绍使用zipInStream和zipOutStream对文件或者文件夹进行压缩和解压缩的文章比较多。
但是这次项目中需要对byte[]进行压缩,然后decode,通过http发送到服务端。
最简单的方法,当然是把byte[]写到文件里,然后根据网上已有的文章,生成fileInputStream,构造zipInStream。
但是这个做法有着明显的问题,需要操作IO,在效率上不可取。
下面是利用ByteArrayOutStream来完成压缩和解压缩的代码。
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
/**
* 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();
}
/**
* 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();
}