Java实现数据压缩 zlib

来源:互联网 发布:windows phone 10安卓 编辑:程序博客网 时间:2024/05/22 08:08
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);    }}
0 0
原创粉丝点击