JavaSE--压缩
阅读原文时间:2023年07月15日阅读:2

package util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class GZipUtils {
public static final int BUFFER = 1024;
public static final String EXT = ".gz";

    /\*\*  
     \* 数据压缩  
     \* @param data  
     \* @return  
     \* @throws Exception  
     \*/  
    public static byte\[\] compress(byte\[\] data) throws Exception{  
        byte\[\] output = null;  
        ByteArrayInputStream bais = new ByteArrayInputStream(data);  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        // 压缩  
        compress(bais, baos);  
        output = baos.toByteArray();  

        baos.flush();  
        baos.close();  

        bais.close();  
        return output;  
    }  

    /\*\*  
     \* 文件压缩  
     \*  
     \* @param file  
     \* @throws Exception  
     \*/  
    public static void compress(File file) throws Exception {  
        compress(file, true);  
    }  

    /\*\*  
     \* 文件压缩  
     \*  
     \* @param file  
     \* @param delete  
     \*            是否删除原始文件  
     \* @throws Exception  
     \*/  
    public static void compress(File file, boolean delete) throws Exception {  
        FileInputStream fis = new FileInputStream(file);  
        FileOutputStream fos = new FileOutputStream(file.getPath() + EXT);  

        compress(fis, fos);  

        fis.close();  
        fos.flush();  
        fos.close();  

        if (delete) {  
          boolean fal=file.delete();  
        }  
    }  

    /\*\*  
     \* 数据压缩  
     \*  
     \* @param is  
     \* @param os  
     \* @throws Exception  
     \*/  
    public static void compress(InputStream is, OutputStream os)  
            throws Exception {  

        GZIPOutputStream gos = new GZIPOutputStream(os);  

        int count;  
        byte data\[\] = new byte\[BUFFER\];  
        while ((count = is.read(data, 0, BUFFER)) != -1) {  
            gos.write(data, 0, count);  
         }  

         gos.finish();  

         gos.flush();  
         gos.close();  
     }  

     /\*\*  
      \* 文件压缩  
      \*  
      \* @param path  
      \* @throws Exception  
      \*/  
     public static void compress(String path) throws Exception {  
         compress(path, true);  
     }  

     /\*\*  
      \* 文件压缩  
      \*  
      \* @param path  
      \* @param delete  
      \*            是否删除原始文件  
      \* @throws Exception  
      \*/  
     public static void compress(String path, boolean delete) throws Exception {  
         File file = new File(path);  
         compress(file, delete);  
     }  

     /\*\*  
      \* 数据解压  
      \*  
      \* @param data  
      \* @return  
      \* @throws Exception  
      \*/  
     public static byte\[\] decompress(byte\[\] data) throws Exception {  
         ByteArrayInputStream bais = new ByteArrayInputStream(data);  
         ByteArrayOutputStream baos = new ByteArrayOutputStream();  

         // 解压

         decompress(bais, baos);  

         data = baos.toByteArray();  

         baos.flush();  
         baos.close();  

         bais.close();  

         return data;  
     }  

     /\*\*  
      \* 数据解压  
      \*  
      \* @param is  
      \* @param os  
      \* @throws Exception  
      \*/  
     public static void decompress(InputStream is, OutputStream os)  
             throws Exception {  
         GZIPInputStream gis = new GZIPInputStream(is);  
         int count;  
         byte data\[\] = new byte\[BUFFER\];  
         while ((count = gis.read(data, 0, BUFFER)) != -1) {  
             os.write(data, 0, count);  
         }  

         gis.close();  
     }  

}

有同事写解压方法的时候直接返回 String 类型,再获取 byte 用 base64 包装,事实说明
ByteArrayOutputStream.toByteArray 输出的结果一般情况下并不能转成 String 类型再转回 byte 类型。
参考:https://zhidao.baidu.com/question/1540471893185651307.html

byte数组转字符串在特定情况下是可以的,byte的内容全部可以用字符表示,否则的话,转换的时候,有些无法用字符表示的数据,在转换的过程中就会出现问题。
如果需要转字符串,可以对byte数组进行base六十四编码,这个base六十四编码的byte可以全部用字符表示,转成字符串,需要的时候,把字符串进行base六十四解密,可以得到原来的byte数组