Java使用GZIP进行压缩和解压缩(GZIPOutputStream,GZIPInputStream)

本文提供了一种使用GZIP进行字符串压缩和解压缩的方法。通过GZIPOutputStream将原始字符串压缩成字节数组,并利用GZIPInputStream完成解压缩过程。示例代码展示了如何实现这一功能。
该文章已生成可运行项目,

使用GZIPOutputStream进行GZIP压缩:

public static byte[] compress(String str, String encoding) {
        if (str == null || str.length() == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip;
        try {
            gzip = new GZIPOutputStream(out);
            gzip.write(str.getBytes(encoding));
            gzip.close();
        } catch (IOException e) {
            ApiLogger.error("gzip compress error.", e);
        }
        return out.toByteArray();
    }



使用GZIPInputStream进行GZIP解压缩:

public static byte[] uncompress(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
        try {
            GZIPInputStream ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[256];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
        } catch (IOException e) {
            ApiLogger.error("gzip uncompress error.", e);
        }

        return out.toByteArray();
    }



完整代码:

package com.weibo.api.proxy.server.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import org.apache.commons.codec.binary.StringUtils;

import cn.sina.api.commons.util.ApiLogger;

/**
 * 
 * @author wenqi5
 * 
 */
public class GZIPUtils {

    public static final String GZIP_ENCODE_UTF_8 = "UTF-8";

    public static final String GZIP_ENCODE_ISO_8859_1 = "ISO-8859-1";

    /**
     * 字符串压缩为GZIP字节数组
     * 
     * @param str
     * @return
     */
    public static byte[] compress(String str) {
        return compress(str, GZIP_ENCODE_UTF_8);
    }

    /**
     * 字符串压缩为GZIP字节数组
     * 
     * @param str
     * @param encoding
     * @return
     */
    public static byte[] compress(String str, String encoding) {
        if (str == null || str.length() == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip;
        try {
            gzip = new GZIPOutputStream(out);
            gzip.write(str.getBytes(encoding));
            gzip.close();
        } catch (IOException e) {
            ApiLogger.error("gzip compress error.", e);
        }
        return out.toByteArray();
    }

    /**
     * GZIP解压缩
     * 
     * @param bytes
     * @return
     */
    public static byte[] uncompress(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
        try {
            GZIPInputStream ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[256];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
        } catch (IOException e) {
            ApiLogger.error("gzip uncompress error.", e);
        }

        return out.toByteArray();
    }

    /**
     * 
     * @param bytes
     * @return
     */
    public static String uncompressToString(byte[] bytes) {
        return uncompressToString(bytes, GZIP_ENCODE_UTF_8);
    }

    /**
     * 
     * @param bytes
     * @param encoding
     * @return
     */
    public static String uncompressToString(byte[] bytes, String encoding) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
        try {
            GZIPInputStream ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[256];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
            return out.toString(encoding);
        } catch (IOException e) {
            ApiLogger.error("gzip uncompress to string error.", e);
        }
        return null;
    }

    public static void main(String[] args) {
        String str =
                        "%5B%7B%22lastUpdateTime%22%3A%222011-10-28+9%3A39%3A41%22%2C%22smsList%22%3A%5B%7B%22liveState%22%3A%221";
        System.out.println("原长度:" + str.length());
        System.out.println("压缩后字符串:" + GZIPUtils.compress(str).toString().length());
        System.out.println("解压缩后字符串:" + StringUtils.newStringUtf8(GZIPUtils.uncompress(GZIPUtils.compress(str))));
        System.out.println("解压缩后字符串:" + GZIPUtils.uncompressToString(GZIPUtils.compress(str)));
    }
}





本文章已经生成可运行项目
### 压缩文件为 GZIP 格式 在 Java 中,使用 `GZIPOutputStream` 类可以实现对文件的 GZIP 压缩操作。该类位于 `java.util.zip` 包中,适用于单个文件的压缩需求。以下是一个基本的 GZIP 压缩实现示例: ```java import java.io.*; import java.util.zip.GZIPOutputStream; public class GZIPCompressor { public static void compressFile(String inputFilePath, String outputGzipPath) throws IOException { FileInputStream fis = new FileInputStream(inputFilePath); GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(outputGzipPath)); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { gzos.write(buffer, 0, len); } gzos.close(); fis.close(); } public static void main(String[] args) { try { compressFile("path/to/input/file.txt", "output/file.txt.gz"); System.out.println("File compressed successfully."); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 解压 GZIP 文件 使用 `GZIPInputStream` 类可以实现对 GZIP 格式文件的解压操作。以下是一个基本的 GZIP 解压实现示例: ```java import java.io.*; import java.util.zip.GZIPInputStream; public class GZIPDecompressor { public static void decompressFile(String inputGzipPath, String outputFilePath) throws IOException { GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(inputGzipPath)); FileOutputStream fos = new FileOutputStream(outputFilePath); byte[] buffer = new byte[1024]; int len; while ((len = gzis.read(buffer)) != -1) { fos.write(buffer, 0, len); } fos.close(); gzis.close(); } public static void main(String[] args) { try { decompressFile("output/file.txt.gz", "path/to/output/file.txt"); System.out.println("File decompressed successfully."); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 注意事项 - GZIP 格式适用于单个文件的压缩和解压,不支持目录结构的打包[^1]。 - 在压缩和解压操作中,需要确保输入和输出流正确关闭,以避免资源泄漏。 - 如果需要处理多个文件或目录结构,可以结合 `Tar` 格式实现打包和解包操作,再使用 GZIP 压缩或解压整个 `.tar` 文件[^2]。 ### 相关问题 1. 如何使用 Apache Commons Compress 实现 GZIP 文件的压缩与解压缩? 2. 如何在 Java 中处理 GZIP 压缩文件中的中文字符? 3. 如何实现多文件打包并使用 GZIP 压缩
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值