Java实现数据压缩 zlib

package com.ecer.common.utils;


import java.io.*;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
/**
 * Created by JiangChunyan on 2016/11/16.
 * Java实现数据压缩
 * ZLib压缩工具
 */
public abstract  class ZLibUtils {
    /**
     * 压缩
     *
     * @param data
     *            待压缩数据
     * @return byte[] 压缩后的数据
     */
    public static byte[] compress(byte[] data) {
        byte[] output = new byte[0];
        Deflater compresser = new Deflater();
        compresser.reset();
        compresser.setInput(data);
        compresser.finish();
        ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);
        try {
            byte[] buf = new byte[1024];
            while (!compresser.finished()) {
                int i = compresser.deflate(buf);
                bos.write(buf, 0, i);
            }
            output = bos.toByteArray();
        } catch (Exception e) {
            output = data;
            e.printStackTrace();
        } finally {
            try {
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        compresser.end();
        return output;
    }

    /**
     * 压缩
     *
     * @param data
     *            待压缩数据
     *
     * @param os
     *            输出流
     */
    public static void compress(byte[] data, OutputStream os) {
        DeflaterOutputStream dos = new DeflaterOutputStream(os);

        try {
            dos.write(data, 0, data.length);

            dos.finish();

            dos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 解压缩
     *
     * @param data
     *            待压缩的数据
     * @return byte[] 解压缩后的数据
     */
    public static byte[] decompress(byte[] data) {
        byte[] output = new byte[0];

        Inflater decompresser = new Inflater();
        decompresser.reset();
        decompresser.setInput(data);

        ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);
        try {
            byte[] buf = new byte[1024];
            while (!decompresser.finished()) {
                int i = decompresser.inflate(buf);
                o.write(buf, 0, i);
            }
            output = o.toByteArray();
        } catch (Exception e) {
            output = data;
            e.printStackTrace();
        } finally {
            try {
                o.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        decompresser.end();
        return output;
    }

    /**
     * 解压缩
     *
     * @param is
     *            输入流
     * @return byte[] 解压缩后的数据
     */
    public static byte[] decompress(InputStream is) {
        InflaterInputStream iis = new InflaterInputStream(is);
        ByteArrayOutputStream o = new ByteArrayOutputStream(1024);
        try {
            int i = 1024;
            byte[] buf = new byte[i];

            while ((i = iis.read(buf, 0, i)) > 0) {
                o.write(buf, 0, i);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return o.toByteArray();
    }



    /**
     * 以行为单位读取文件,常用于读面向行的格式化文件
     */
    public static String readFileByLines(String fileName) {
        File file = new File(fileName);
        BufferedReader reader = null;

        StringBuffer bf=new StringBuffer();
        try {
            System.out.println("以行为单位读取文件内容,一次读一整行:");
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
//            int line = 1;
            // 一次读入一行,直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
//                // 显示行号
//                System.out.println("line " + line + ": " + tempString);
//                line++;

                bf.append(tempString);
                bf.append(System.getProperty("line.separator"));
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
        return  bf.toString();
    }



    public static void main(String[] args) {
        System.out.println("字节压缩/解压缩测试");
//        String inputStr = "95.24.118.233 - - [15/Nov/2016:00:00:01 +0800] \"GET /min/?b=myres/js&f=jquery-1.9.1.min.js,jquery-migrate-1.2.1.min.js,jump.js,MSClass.js,projector.js HTTP/1.0\" 200 44985 \"http://forimi-beauty-machines-com.buy.weamax.com/products/page8.html\" \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36\" style.weamax.com - 0.005\n";
//        输入字节长度:371
//        压缩后字节长度:293
        String inputStr= ZLibUtils.readFileByLines("C:\\Users\\Administrator\\Documents\\weamax_access_log.20161115");
//        输入字节长度:39758338
//      压缩后字节长度:7081319

        System.out.println("输入字符串:" + inputStr);
        byte[] input = inputStr.getBytes();
        System.out.println("输入字节长度:" + input.length);

        byte[] data = ZLibUtils.compress(input);
        System.out.println("压缩后字节长度:" + data.length);

        byte[] output = ZLibUtils.decompress(data);
        System.out.println("解压缩后字节长度:" + output.length);
//        String outputStr = new String(output);
//        System.out.println("输出字符串:" + outputStr);
    }
}

你可能感兴趣的:(java)