`

使用Java.util.zip下的zipOutStream和zipInStream对字节流进行压缩和解压缩

    博客分类:
  • Java
阅读更多

参考: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();
    }
分享到:
评论

相关推荐

    用java.util.zip包现数据压缩与解压

    ### 使用 Java.util.zip 包实现数据压缩与解压 在计算机科学领域,数据压缩技术是一项重要的功能,它能够帮助减少存储空间的需求以及提高网络传输效率。本文将通过一系列的示例来详细介绍如何利用 Java 中的 `java....

    java.util.zip 解压缩文件,ZIP格式压缩文件.rar

    总结一下,`java.util.zip` 包提供了解压缩和压缩文件的强大功能,这对于任何需要处理ZIP文件的Java开发者来说都是必不可少的工具。无论你是想解压下载的库,还是想将项目文件打包成ZIP,这个包都能提供简洁且高效的...

    java+apache完成zip压缩源码(包括修改后的java.util.zip下的源码)

    为了支持中文文件名,我们需要对`java.util.zip`下的源码进行修改,尤其是`ZipOutputStream`类。主要的修改点可能在于设置正确的字符编码,例如使用`UTF-8`。在创建`ZipEntry`对象时,需要确保文件名被正确地转换为...

    根据java.util.zip源码修改zip支持中文

    在Java编程语言中,`java.util.zip`包提供了对压缩文件格式的支持,如ZIP和GZ等。然而,早期版本的Java在处理包含非ASCII字符(例如中文字符)的文件名时存在一些问题。这是因为ZIP文件格式本身是支持Unicode编码的...

    java.util.Date与java.sql.Date互转及字符串转换为日期时间格式.docx

    在Java编程语言中,处理日期和时间时经常使用到`java.util.Date`和`java.sql.Date`这两个类。它们虽然名字相似,但在实际应用中有很大的区别。 - **`java.util.Date`**:这个类提供了创建和操作日期/时间的功能,它...

    Exception in thread “main“ java.util.InputMismatchException.pdf

    在Java编程语言中,`java.util.InputMismatchException`是一个常见的运行时异常,它通常发生在尝试从数据源(如控制台、文件或数据库)读取数据时,遇到的数据类型与预期的不匹配。在这个特定的场景中,问题出在主线...

    java.util.Date与java.sql.Date相互转换

    ### Java.util.Date与Java.sql.Date相互转换 #### 知识点概述 在Java开发中,经常...通过上述方法,可以在Java程序中灵活地完成 `java.util.Date` 和 `java.sql.Date` 之间的相互转换,从而满足不同场景下的需求。

    zipper.zip_java zipper_java.util包_zip_遗传算法

    在Java编程语言中,`java.util.zip`包提供了一系列类和接口,用于处理ZIP文件格式。这个包的主要目的是为了方便地进行文件的压缩和解压缩操作。`Zipper`类是一个自定义的类,它利用了`java.util.zip`包中的功能来...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    "java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError" 是一个典型的错误提示,它表明在并发执行过程中遇到了内存不足的问题。下面我们将深入探讨这个问题的原因、影响以及如何解决。 内存溢出...

    tomcat启动报错:java.util.zip.ZipException的解决方法

    在使用Apache Tomcat服务器时,有时会遇到启动异常的情况,其中一种常见的错误是`java.util.zip.ZipException`。这个异常通常表明在处理ZIP或JAR文件时遇到了问题,可能是因为文件损坏、格式不正确或者无法打开。在...

    java.util包

    Java提供日期(Data)类、日历(Calendar)类,随机数(Random)类,堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构

    java.util.logging.Logger使用详解

    ### Java.util.logging.Logger 使用详解 #### 一、创建Logger对象 在Java中,`java.util.logging.Logger` 是标准的日志框架之一,它提供了基础的日志记录功能。为了使用这一功能,首先需要获得 `java.util.logging...

    java.sql.与java.util

    Java编程语言提供了两个重要的日期处理类,分别是`java.util.Date`和`java.sql.Date`,它们在处理日期和时间上有着不同的特性和用途。 `java.util.Date`是更通用的日期时间类,它包含了日期和时间的信息,可以精确...

    利用java.util.zip 包中提供的类来实现压缩和解压zip 格式文件的功能.rar

    在Java编程语言中,`java.util.zip`包提供了一系列的类和接口,用于处理ZIP格式的压缩和解压缩操作。这个包中的核心类包括`ZipOutputStream`和`ZipInputStream`,它们分别用于创建ZIP文件和读取解压缩ZIP文件。下面...

    java.sql.date与java.util.date.pdf

    在Java中,`java.util.Date` 和 `java.sql.Date` 都是用来表示日期的类,但它们有着不同的应用场景和特性。 `java.util.Date` 是一个广泛使用的类,它可以表示从1970年1月1日(UTC)午夜开始到现在的毫秒数。这个类...

    java.util.Date与java.sql.Date互转及字符串转换为日期时间格式[文].pdf

    java.util.Date和java.sql.Date是两个不同的日期时间类,需要根据实际情况选择正确的使用场景。理解它们之间的区别和互转方式是非常重要的。在进行数据库操作时,需要注意java.sql.Date的规范化问题,以免数据截取。...

Global site tag (gtag.js) - Google Analytics