1. 程式人生 > >Java對字串的壓縮與解壓

Java對字串的壓縮與解壓

package com.utils;


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


public class GZipStrUtil {


    public static void main(String[] args) throws IOException {
        // 字串超過一定的長度
        String str = "ABCdef123中文
[email protected]
#$%^&*()_+{};/1111111111111111111111111AAAAAAAAAAAJDLFJDLFJDLFJLDFFFFJEIIIIIIIIIIFJJJJJJJJJJJJALLLLLLLLLLLLLLLLLLLLLL" +
                "LLppppppppppppppppppppppppppppppppppppppppp===========================------------------------------iiiiiiiiiiiiiiiiiiiiiii";
        System.out.println("\n原始的字串為------->" + str);
        float len0=str.length();
        System.out.println("原始的字串長度為------->"+len0);


        String ys = compress(str);
        System.out.println("\n壓縮後的字串為----->" + ys);
        float len1=ys.length();
        System.out.println("壓縮後的字串長度為----->" + len1);


        String jy = unCompress(ys);
        System.out.println("\n解壓縮後的字串為--->" + jy);
        System.out.println("解壓縮後的字串長度為--->"+jy.length());
        
        System.out.println("\n壓縮比例為"+len1/len0);
        
        //判斷
        if(str.equals(jy)){
            System.out.println("先壓縮再解壓以後字串和原來的是一模一樣的");
        }
    }


    /**
     * 字串的壓縮
     * 
     * @param str
     *            待壓縮的字串
     * @return    返回壓縮後的字串
     * @throws IOException
     */
    public static String compress(String str) throws IOException {
        if (null == str || str.length() <= 0) {
            return str;
        }
        System.out.println("\n原始的字串為------->" + str);
        float len0=str.length();
        System.out.println("原始的字串長度為------->"+len0);
        // 建立一個新的 byte 陣列輸出流
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        // 使用預設緩衝區大小建立新的輸出流
        GZIPOutputStream gzip = new GZIPOutputStream(out);
        // 將 b.length 個位元組寫入此輸出流
        gzip.write(str.getBytes());
        gzip.close();
        // 使用指定的 charsetName,通過解碼位元組將緩衝區內容轉換為字串
        System.out.println("\n壓縮後的字串為----->" + out);
        float len1=out.toString("ISO-8859-1").length();
        System.out.println("壓縮後的字串長度為----->" + len1);
        System.out.println("\n壓縮比例為"+len1/len0);
        //判斷
        if(str.equals(unCompress(out.toString("ISO-8859-1")))){
            System.out.println("先壓縮再解壓以後字串和原來的是一模一樣的");
        }else{
        System.out.println("先壓縮再解壓以後字串和原來的不一樣");
        }
        return out.toString("ISO-8859-1");
    }
    
    /**
     * 字串的解壓
     * 
     * @param str
     *            對字串解壓
     * @return    返回解壓縮後的字串
     * @throws IOException
     */
    public static String unCompress(String str) throws IOException {
        if (null == str || str.length() <= 0) {
            return str;
        }
        // 建立一個新的 byte 陣列輸出流
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        // 建立一個 ByteArrayInputStream,使用 buf 作為其緩衝區陣列
        ByteArrayInputStream in = new ByteArrayInputStream(str
                .getBytes("ISO-8859-1"));
        // 使用預設緩衝區大小建立新的輸入流
        GZIPInputStream gzip = new GZIPInputStream(in);
        byte[] buffer = new byte[256];
        int n = 0;
        while ((n = gzip.read(buffer)) >= 0) {// 將未壓縮資料讀入位元組陣列
            // 將指定 byte 陣列中從偏移量 off 開始的 len 個位元組寫入此 byte陣列輸出流
            out.write(buffer, 0, n);
        }
        // 使用指定的 charsetName,通過解碼位元組將緩衝區內容轉換為字串
        return out.toString("GBK");
    }


}