对传输数据的压缩

对传输数据的压缩

上次写了关于客户端与服务端传输数据的加密,但对大量数据加密操作要花费大量的时间,所以对于大量数据最好进行压缩后再加密,同时我们平时传输的数据如果太多也可以压缩后再传输,我们对zip加密方法对数据加密,先写代码:

public class ZipUtils {
    public static void main(String [] args){
        String s = ""; //s中写出对应的字符串,下面我们对字符串的长度和格式进行分析
        System.out.println(s.length());
        String s1 = zip(s);
        System.out.println(s1.length());
        String s2 = unzip(s1);
        System.out.println(s2.length());
    }

/**
     * 使用zip进行压缩
     * 
     * @param str
     *            压缩前的文本
     * @return 返回压缩后的文本
     */
    public static final String zip(String str) {
        if (str == null)
            return null;
        byte[] compressed;
        ByteArrayOutputStream out = null;
        ZipOutputStream zout = null;
        String compressedStr = null;
        try {
            out = new ByteArrayOutputStream();
            zout = new ZipOutputStream(out);
            zout.putNextEntry(new ZipEntry("0"));
            zout.write(str.getBytes());
            zout.closeEntry();
            compressed = out.toByteArray();
            compressedStr = new sun.misc.BASE64Encoder().encodeBuffer(compressed);
        } catch (IOException e) {
            compressed = null;
        } finally {
            if (zout != null) {
                try {
                    zout.close();
                } catch (IOException e) {
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                }
            }
        }
        return compressedStr;
    }

    /**
     * 使用zip进行解压缩
     * 
     * @param compressedStr
     *            压缩后的文本
     * @return 解压后的字符串
     */
    public static final String unzip(String compressedStr) {
        if (compressedStr == null) {
            return null;
        }

        ByteArrayOutputStream out = null;
        ByteArrayInputStream in = null;
        ZipInputStream zin = null;
        String decompressed = null;
        try {
            byte[] compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);
            out = new ByteArrayOutputStream();
            in = new ByteArrayInputStream(compressed);
            zin = new ZipInputStream(in);
            zin.getNextEntry();
            byte[] buffer = new byte[1024];
            int offset = -1;
            while ((offset = zin.read(buffer)) != -1) {
                out.write(buffer, 0, offset);
            }
            decompressed = out.toString();
        } catch (IOException e) {
            decompressed = null;
        } finally {
            if (zin != null) {
                try {
                    zin.close();
                } catch (IOException e) {
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                }
            }
        }
        return decompressed;
    }
}

我们来分析一下压缩的效率
如果我们的字符串很短,我们压缩的字符串会比原来的大
String s = “{[{\”username\”:\”123\”,\”password\”:\”1234123\”},{\”username\”:\”wer\”,\”password\”:\”sdffssdsf\”},{\”username\”:\”dew\”,\”password\”:\”122332r3er\”}]}”;
我们的到的结果:

128
163
128

但是如果我们的数据很多结果就不一样了,我们构造一个字符串

public static void main(String [] args){
        String s4 = "";
        for(int i=0; i<100; i++){
            s4 = s4 + "{\"username\":" + Math.random()*100 + ",\"password\":" + UUID.randomUUID() + "},";
        }
        s4 = s4.substring(0, s4.length()-1);
        s4 = "{[" + s4 + "]}";
        System.out.println(s4.length());
        String s1 = zip(s4);
        System.out.println(s1.length());
        String s2 = unzip(s1);
        System.out.println(s2.length());
    }

结果:

7926
4770
7926

我们可以看到当我们的数据很多时我们的压缩方法可以很大程度的减小字符的长度,但当我们的信息量不大时,压缩算法所构建的映射表的长度占的比重很大,压缩的字符串就比原来的字符串的长度长,所以我们在使用压缩算法时一定要判断数据的长度,要不然就不一定能够减小我们要传输的信息量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值