日期:2014-05-20  浏览次数:20969 次

JAVA 字符串压缩 或 编码,以节省存储空间
由于需要将一个较大的参数值 进行数据库存储,
而存储后在进行读取时会由于该表的存储量很大,这个值会导致加大IO

我们在JAVA中能否使用一个比较高压缩的方式或进行编码、加密也可,或者某种手段将这个字符串的长度进行压缩
比如一个字符串的长度为300,在进行压缩后会变为150或更少

试了ZIP压缩不太理想,使用BASE64反而会增大,3DES的方式也不太好

想请教各位,有关这方面可用的技巧或思路!

------解决方案--------------------
http://topic.csdn.net/t/20060214/14/4555387.html

不知这个帖子对lz有没有帮助
------解决方案--------------------
小弟从网上找了个,觉得还是不错的...

Java code

    main{
        try
        {
            String str = "中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中"
                         + "中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中"
                         + "中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中"
                         + "中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中"
                         + "中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中"
                         + "中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中中国中国中";
            String comp = compress(str);
            System.out.println(str.length());
            System.out.println(comp.length());
            String umComp = uncompress(comp);
            System.out.println(umComp);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

     // 压缩
      public static String compress(String str) throws IOException {
        if (str == null || str.length() == 0) {
          return str;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(out);
        gzip.write(str.getBytes());
        gzip.close();
        return out.toString("ISO-8859-1");
      }

      // 解压缩
      public static String uncompress(String str) throws IOException {
        if (str == null || str.length() == 0) {
          return str;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(str
            .getBytes("ISO-8859-1"));
        GZIPInputStream gunzip = new GZIPInputStream(in);
        byte[] buffer = new byte[256];
        int n;
        while ((n = gunzip.read(buffer)) >= 0) {
          out.write(buffer, 0, n);
        }
        // toString()使用平台默认编码,也可以显式的指定如toString("GBK")
        return out.toString();
      }

------解决方案--------------------
如果字符串比较大,是否考虑把字符串存储到文件中,在数据库中存储该文件的路径!
------解决方案--------------------
比如一个字符串的长度为300,在进行压缩后会变为150或更少
——规模太小了,压缩时生成的头信息都会消耗不少空间

试了ZIP压缩不太理想,使用BASE64反而会增大,3DES的方式也不太好
——BASE64根本就不是压缩,必然要增大;3DES是加密,不增大就算你运气很好了。

由于需要将一个较大的参数值 进行数据库存储
——如果可以,给出该参数值的形式,也许可以通过研究该参数值的规律来进行压缩。

不过说句心里话,才300字节,不要纠结了,这个IO简直可以忽略不计,实在不值得去压缩。。。。。

如果你很希望保证数据块内尽可能多存放数据行以提升list查询性能的话,可以将值用扩展表存储。
------解决方案--------------------
zip压缩是大于150吗

不是很确定,可能还真的得看被压缩对象的内容而定
比如用16进制字符串代替2进制字符串存储,就更省空间
进制差越大,压缩率越高
可能这也是压缩的其中一种方法吧
------解决方案--------------------
关键能实现一个高压缩比算法,等实现后降低压缩比可提高性能