`
ol_beta
  • 浏览: 289292 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Java压缩/解压缩二进制文件

    博客分类:
  • java
阅读更多

在Java中提供DeflaterInflater工具类来压缩/解压缩数据。 这两个工具类采用zlib算法,下面给出一个封装好的工具。

    /**
     * util for compress/decompress data
     * 
     * @author lichengwu
     * @version 1.0
     * @created 2013-02-07 10:14 AM
     */
    public final class CompressionUtil {
    
        private static final int BUFFER_SIZE = 4 * 1024;
    
        /**
         * compress data by {@linkplain Level}
         * 
         * @author lichengwu
         * @created 2013-02-07
         * 
         * @param data
         * @param level
         *            see {@link Level}
         * @return
         * @throws IOException
         */
        public static byte[] compress(byte[] data, Level level) throws IOException {
    
            Assert.notNull(data);
            Assert.notNull(level);
    
            Deflater deflater = new Deflater();
            // set compression level
            deflater.setLevel(level.getLevel());
            deflater.setInput(data);
    
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
    
            deflater.finish();
            byte[] buffer = new byte[BUFFER_SIZE];
            while (!deflater.finished()) {
                int count = deflater.deflate(buffer); // returns the generated
                                                      // code... index
                outputStream.write(buffer, 0, count);
            }
            byte[] output = outputStream.toByteArray();
    		outputStream.close();
            return output;
        }
    
        /**
         * decompress data
         * 
         * @author lichengwu
         * @created 2013-02-07
         * 
         * @param data
         * @return
         * @throws IOException
         * @throws DataFormatException
         */
        public static byte[] decompress(byte[] data) throws IOException, DataFormatException {
    
            Assert.notNull(data);
    
            Inflater inflater = new Inflater();
            inflater.setInput(data);
    
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
            byte[] buffer = new byte[BUFFER_SIZE];
            while (!inflater.finished()) {
                int count = inflater.inflate(buffer);
                outputStream.write(buffer, 0, count);
            }
            byte[] output = outputStream.toByteArray();
    		outputStream.close();
            return output;
        }
    
        /**
         * Compression level
         */
        public static enum Level {
    
            /**
             * Compression level for no compression.
             */
            NO_COMPRESSION(0),
    
            /**
             * Compression level for fastest compression.
             */
            BEST_SPEED(1),
    
            /**
             * Compression level for best compression.
             */
            BEST_COMPRESSION(9),
    
            /**
             * Default compression level.
             */
            DEFAULT_COMPRESSION(-1);
    
            private int level;
    
            Level(
    
            int level) {
                this.level = level;
            }
            public int getLevel() {
                return level;
            }
        }  
    }

 下面是一个测试:

    @Test
    public void testCompress() throws Exception {

        BufferedInputStream in = new BufferedInputStream(new FileInputStream(
                "/Users/lichengwu/tmp/out_put.txt.bak"));
        ByteArrayOutputStream out = new ByteArrayOutputStream(1024);

        byte[] temp = new byte[1024];
        int size = 0;
        while ((size = in.read(temp)) != -1) {
            out.write(temp, 0, size);
        }
        in.close();
        byte[] data = out.toByteArray();
        byte[] output = CompressionUtil.compress(data, CompressionUtil.Level.BEST_COMPRESSION);
        System.out.println("before : " + (data.length / 1024) + "k");
        System.out.println("after : " + (output.length / 1024) + "k");

        FileOutputStream fos = new FileOutputStream("/Users/lichengwu/tmp/out_put.txt.bak.compress");
        fos.write(output);
        out.close();
        fos.close();
    }

    @Test
    public void testDecompress() throws Exception {

        BufferedInputStream in = new BufferedInputStream(new FileInputStream(
                "/Users/lichengwu/tmp/out_put.txt.bak.compress"));
        ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
        byte[] temp = new byte[1024];
        int size = 0;
        while ((size = in.read(temp)) != -1) {
            out.write(temp, 0, size);
        }
        in.close();
        byte[] data = out.toByteArray();
        byte[] output = CompressionUtil.decompress(data);
        System.out.println("before : " + (data.length / 1024) + "k");
        System.out.println("after : " + (output.length / 1024) + "k");

        FileOutputStream fos = new FileOutputStream("/Users/lichengwu/tmp/out_put.txt.bak.decompress");
        fos.write(output);
        out.close();
        fos.close();
    }

 关于OutOfMemoryError,请参考:http://www.devguli.com/blog/eng/java-deflater-and-outofmemoryerror/

3
0
分享到:
评论

相关推荐

    Hyperledger Fabric linux二进制文件

    2. **安装步骤**:首先,将RAR文件解压缩到Linux环境中,通常是在用户目录或指定的工作目录下。然后,设置环境变量,如FABRIC_CFG_PATH指向配置文件目录,将bin和lib目录添加到PATH环境变量中,以便系统能找到执行...

    二进制与字符串之间的转换类CBinary

    5. **数据压缩与解压缩**:为了节省存储空间或提高传输效率,二进制数据可能需要进行压缩。`CBinary`可能集成了常见的压缩算法,如gzip或lz4,允许用户对二进制数据进行压缩和解压缩。 6. **数据加密与解密**:为了...

    哈夫曼编码实现压缩解压缩java

    - 解压缩时,同样需要从文件读取二进制数据,`FileInputStream`和`BufferedInputStream`可帮助完成这个任务。 综上所述,哈夫曼编码是通过构建特定的哈夫曼树,根据字符出现频率生成二进制编码,以此实现数据压缩...

    二进制打包解包

    二进制打包是将源代码或者程序转换为可执行的二进制文件,以便在计算机上运行。解包则是相反的过程,即从二进制格式还原出原始的数据或代码。这个过程对于理解和操作软件及其数据至关重要。 二进制打包的目的是为了...

    Huffman 压缩解压缩 Java实现

    需要注意的是,Java实现的Huffman压缩解压缩不适用于二进制文件,因为二进制文件的字节分布与ASCII文档不同,直接应用ASCII字符频率统计可能会导致压缩效果不佳。对于二进制文件,通常需要先进行预处理,如使用字节...

    基于JAVA的文件压缩与解压缩工具设计与实现

    在Java编程语言中,设计和实现一个文件压缩与解压缩工具涉及到多个核心概念和技术。首先,我们需要理解文件I/O操作,这是任何文件处理程序的基础。Java提供了`java.io`包,其中包含各种类用于读写文件,如`File`, `...

    JAVA文件压缩与解压缩实践(源代码+论文).rar

    6. **毕业设计**:对于计算机科学的学生来说,这样的毕业设计有助于提升实际编程技能,理解文件系统的操作,以及如何利用Java处理二进制数据和文件流。同时,通过编写论文,学生可以学习到如何系统地描述和解释技术...

    jdk8 解压缩安装包下载地址https://www.oracle.com/java/technologies/download

    1. **下载JDK8**:访问官方下载链接,根据你的Linux发行版选择对应的二进制文件,通常为`.tar.gz`格式。 2. **解压JDK8**:下载完成后,将文件移动到你需要安装的目录,例如 `/opt`,然后使用以下命令解压缩: ``...

    [计算机项目]基于java的文件压缩与解压缩系统设计与实现(源代码+项目报告).zip

    BufferedReader和BufferedWriter可以用来分块读写文本文件,而字节数组缓冲区(ByteBuffer)可用于二进制文件。 8. **异常处理**: 在文件操作中,可能出现各种异常,如FileNotFoundException、IOException等。...

    对于任意一个文件进行压缩,压缩后的文件名为原文件名称去掉后缀加上.hz,例如,原来的未压缩文件的名字为a.txt,压缩后为a.hz

    (c) 压缩内容不再是文本字符数据,而是任意二进制文件,请压缩附件中的“全球变暖的公益广告视频”(qqbn_gygg.flv)。 注意:(a) 先假设压缩的文件的长度都不大,不考虑效率问题,可以使用缓存。 (b) 以前的霍夫曼...

    玉照写出到图形文件二进制数据流读取文件

    "玉照写出到图形文件二进制数据流读取文件"这个标题暗示了我们要讨论的是如何将图像(玉照)转换为二进制数据流,并进行读取和写入到图形文件的过程。下面我们将深入探讨这一主题。 首先,我们需要理解图片的基本...

    基于linux下:jdk-1.8.0二进制安装包

    将下载的JDK二进制包解压缩到刚创建的目录中。假设你的二进制包在当前用户的下载目录中: ``` sudo tar -zxf ~/Downloads/jdk-1.8.0_linux-x64_bin.tar.gz -C /usr/lib/jvm/jdk1.8.0_00/ ``` 3. **配置环境变量...

    java实现上传文件类型检测过程解析

    在 Java 中,可以使用 FileInputStream 读取文件的二进制数据,并将其转换为十六进制字符串。然后,使用 HashMap 缓存文件头信息,通过文件头信息来判断文件的真正类型。 以下是 Java 实现上传文件类型检测过程解析...

    Java带密码解压缩RAR压缩包(内附代码)

    文件名`java-unrar_gnu-crypto`可能就是这个库的源代码或者二进制包。 要使用`java-unrar`库,首先将其添加到你的项目依赖中。如果是Maven项目,可以在pom.xml文件中添加如下依赖: ```xml <groupId>de....

    bitmap或者png转.rgba二进制文件

    `bitmap`和`png`是两种常见的图像格式,而将它们转换为`.rgba`二进制文件则涉及到图像数据的处理和理解。`.rgba`文件通常指的是包含红、绿、蓝和透明度(Alpha)通道的原始像素数据,这种格式在进行图像处理和渲染时...

    java哈夫曼编码,压缩,解压缩

    - 然后,遍历压缩后的二进制字符串,按照哈夫曼编码表还原出原来的字符,得到解压缩后的文本。 在描述中提到,这个项目包含了一个带有界面的Java应用,可以实现哈夫曼编码的压缩和解压缩功能。这意味着它可能包括...

    JAVA文件压缩与解压缩实践(源代码+论文).zip

    Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean...JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。

    整数可变字节的压缩算法

    3. 返回生成的字节数组,这就是整数序列的压缩二进制流。 在`test1.java`文件中,很可能包含了具体的实现代码。通常,这样的代码会包含类、方法和循环结构,用于处理整数序列和字节流。例如,可能会有一个`...

    Huffman 霍夫曼 无损压缩 算法实现 java

    - 将替换后的二进制序列写入文件,可以以二进制格式存储,例如`.huff`文件。 4. **解压缩过程:** - 读取`.huff`文件,按照霍夫曼编码表反向操作,将二进制序列还原为原始字符。 - 由于霍夫曼编码是无损的,解...

    OpenJDK 二进制安装

    2. **解压文件**:使用解压缩软件(如WinRAR或7-Zip)打开`openjdk-18.0.2_windows-x64_bin.zip`,将其解压到一个你选择的目录,比如`C:\Program Files\OpenJDK`。 3. **设置环境变量**: - 打开系统属性,选择...

Global site tag (gtag.js) - Google Analytics