Java压缩字符串的方法收集

Posted Jim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java压缩字符串的方法收集相关的知识,希望对你有一定的参考价值。

说明:

1、一般来说要实现压缩,那么返回方式一般是用byte[]数组。

2、研究发现byte[]数组在转成可读的String时,大小会还原回原来的。

3、如果采用压缩之后不可读的String时,互相转换大小会变小,唯一缺点就是转出的String不可读,需要再次解码之后才可读。

4、对于压缩一般最近常听的应该就是gzip这些。

实现一:

/***
  * 压缩GZip
  * 
  * @param data
  * @return
  */
 public static byte[] gZip(byte[] data) {
  byte[] b = null;
  try {
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   GZIPOutputStream gzip = new GZIPOutputStream(bos);
   gzip.write(data);
   gzip.finish();
   gzip.close();
   b = bos.toByteArray();
   bos.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return b;
 }

/***
  * 解压GZip
  * 
  * @param data
  * @return
  */
 public static byte[] unGZip(byte[] data) {
  byte[] b = null;
  try {
   ByteArrayInputStream bis = new ByteArrayInputStream(data);
   GZIPInputStream gzip = new GZIPInputStream(bis);
   byte[] buf = new byte[1024];
   int num = -1;
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   while ((num = gzip.read(buf, 0, buf.length)) != -1) {
    baos.write(buf, 0, num);
   }
   b = baos.toByteArray();
   baos.flush();
   baos.close();
   gzip.close();
   bis.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return b;
 }



/***
  * 压缩Zip
  * 
  * @param data
  * @return
  */
 public static byte[] zip(byte[] data) {
  byte[] b = null;
  try {
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   ZipOutputStream zip = new ZipOutputStream(bos);
   ZipEntry entry = new ZipEntry("zip");
   entry.setSize(data.length);
   zip.putNextEntry(entry);
   zip.write(data);
   zip.closeEntry();
   zip.close();
   b = bos.toByteArray();
   bos.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return b;
 }

/***
  * 解压Zip
  * 
  * @param data
  * @return
  */
 public static byte[] unZip(byte[] data) {
  byte[] b = null;
  try {
   ByteArrayInputStream bis = new ByteArrayInputStream(data);
   ZipInputStream zip = new ZipInputStream(bis);
   while (zip.getNextEntry() != null) {
    byte[] buf = new byte[1024];
    int num = -1;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((num = zip.read(buf, 0, buf.length)) != -1) {
     baos.write(buf, 0, num);
    }
    b = baos.toByteArray();
    baos.flush();
    baos.close();
   }
   zip.close();
   bis.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return b;
 }

/***
  * 压缩BZip2
  * 
  * @param data
  * @return
  */
 public static byte[] bZip2(byte[] data) {
  byte[] b = null;
  try {
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   CBZip2OutputStream bzip2 = new CBZip2OutputStream(bos);
   bzip2.write(data);
   bzip2.flush();
   bzip2.close();
   b = bos.toByteArray();
   bos.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return b;
 }

 /***
  * 解压BZip2
  * 
  * @param data
  * @return
  */
 public static byte[] unBZip2(byte[] data) {
  byte[] b = null;
  try {
   ByteArrayInputStream bis = new ByteArrayInputStream(data);
   CBZip2InputStream bzip2 = new CBZip2InputStream(bis);
   byte[] buf = new byte[1024];
   int num = -1;
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   while ((num = bzip2.read(buf, 0, buf.length)) != -1) {
    baos.write(buf, 0, num);
   }
   b = baos.toByteArray();
   baos.flush();
   baos.close();
   bzip2.close();
   bis.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return b;
 }

/**
  * 把字节数组转换成16进制字符串
  * 
  * @param bArray
  * @return
  */
 public static String bytesToHexString(byte[] bArray) {
  StringBuffer sb = new StringBuffer(bArray.length);
  String sTemp;
  for (int i = 0; i < bArray.length; i++) {
   sTemp = Integer.toHexString(0xFF & bArray[i]);
   if (sTemp.length() < 2)
    sb.append(0);
   sb.append(sTemp.toUpperCase());
  }
  return sb.toString();
 }


/**
  *jzlib 压缩数据
  * 
  * @param object
  * @return
  * @throws IOException
  */
 public static byte[] jzlib(byte[] object) {
  byte[] data = null;
  try {
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   ZOutputStream zOut = new ZOutputStream(out,
     JZlib.Z_DEFAULT_COMPRESSION);
   DataOutputStream objOut = new DataOutputStream(zOut);
   objOut.write(object);
   objOut.flush();
   zOut.close();
   data = out.toByteArray();
   out.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return data;
 }
 /**
  *jzLib压缩的数据
  * 
  * @param object
  * @return
  * @throws IOException
  */
 public static byte[] unjzlib(byte[] object) {
  byte[] data = null;
  try {
   ByteArrayInputStream in = new ByteArrayInputStream(object);
   ZInputStream zIn = new ZInputStream(in);
   byte[] buf = new byte[1024];
   int num = -1;
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   while ((num = zIn.read(buf, 0, buf.length)) != -1) {
    baos.write(buf, 0, num);
   }
   data = baos.toByteArray();
   baos.flush();
   baos.close();
   zIn.close();
   in.close();
   
  } catch (IOException e) {
   e.printStackTrace();
  }
  return data;
 }
 public static void main(String[] args) {
  String s = "this is a test";
  
  byte[] b1 = zip(s.getBytes());
  System.out.println("zip:" + bytesToHexString(b1));
  byte[] b2 = unZip(b1);
  System.out.println("unZip:" + new String(b2));
  byte[] b3 = bZip2(s.getBytes());
  System.out.println("bZip2:" + bytesToHexString(b3));
  byte[] b4 = unBZip2(b3);
  System.out.println("unBZip2:" + new String(b4));
  byte[] b5 = gZip(s.getBytes());
  System.out.println("bZip2:" + bytesToHexString(b5));
  byte[] b6 = unGZip(b5);
  System.out.println("unBZip2:" + new String(b6));
  byte[] b7 = jzlib(s.getBytes());
  System.out.println("jzlib:" + bytesToHexString(b7));
  byte[] b8 = unjzlib(b7);
  System.out.println("unjzlib:" + new String(b8));
 }
}

实现二:

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

// 将一个字符串按照zip方式压缩和解压缩
public class ZipUtil {

  // 压缩
  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();
  }

  // 测试方法
  public static void main(String[] args) throws IOException {
    System.out.println(ZipUtil.uncompress(ZipUtil.compress("中国China")));
  }

}

实现三:

import java.io.ByteArrayInputStream;    
import java.io.ByteArrayOutputStream;    
import java.io.IOException;    
import java.util.zip.ZipEntry;    
import java.util.zip.ZipInputStream;    
import java.util.zip.ZipOutputStream;    
    
public class StringCompress {    
    public static final byte[] compress(String paramString) {    
        if (paramString == null)    
            return null;    
        ByteArrayOutputStream byteArrayOutputStream = null;    
        ZipOutputStream zipOutputStream = null;    
        byte[] arrayOfByte;    
        try {    
            byteArrayOutputStream = new ByteArrayOutputStream();    
            zipOutputStream = new ZipOutputStream(byteArrayOutputStream);    
            zipOutputStream.putNextEntry(new ZipEntry("0"));    
            zipOutputStream.write(paramString.getBytes());    
            zipOutputStream.closeEntry();    
            arrayOfByte = byteArrayOutputStream.toByteArray();    
        } catch (IOException localIOException5) {    
            arrayOfByte = null;    
        } finally {    
            if (zipOutputStream != null)    
                try {    
                    zipOutputStream.close();    
                } catch (IOException localIOException6) {    
            }    
            if (byteArrayOutputStream != null)    
                try {    
                    byteArrayOutputStream.close();    
                } catch (IOException localIOException7) {    
            }    
        }    
        return arrayOfByte;    
    }    
    
    @SuppressWarnings("unused")    
    public static final String decompress(byte[] paramArrayOfByte) {    
        if (paramArrayOfByte == null)    
            return null;    
        ByteArrayOutputStream byteArrayOutputStream = null;    
        ByteArrayInputStream byteArrayInputStream = null;    
        ZipInputStream zipInputStream = null;    
        String str;    
        try {    
            byteArrayOutputStream = new ByteArrayOutputStream();    
            byteArrayInputStream = new ByteArrayInputStream(paramArrayOfByte);    
            zipInputStream = new ZipInputStream(byteArrayInputStream);    
            ZipEntry localZipEntry = zipInputStream.getNextEntry();    
            byte[] arrayOfByte = new byte[1024];    
            int i = -1;    
            while ((i = zipInputStream.read(arrayOfByte)) != -1)    
                byteArrayOutputStream.write(arrayOfByte, 0, i);    
            str = byteArrayOutputStream.toString();    
        } catch (IOException localIOException7) {    
            str = null;    
        } finally {    
            if (zipInputStream != null)    
                try {    
                    zipInputStream.close();    
                } catch (IOException localIOException8) {    
                }    
            if (byteArrayInputStream != null)    
                try {    
                    byteArrayInputStream.close();    
                } catch (IOException localIOException9) {    
                }    
            if (byteArrayOutputStream != null)    
                try {    
                    byteArrayOutputStream.close();    
                } catch (IOException localIOException10) {    
            }    
        }    
        return str;    
    }    
}    

 

参考:

https://www.cnblogs.com/dongzhongwei/p/5964758.html(以上内容部分转自此篇文章)

http://www.blogjava.net/fastunit/archive/2008/04/25/195932.html(以上内容部分转自此篇文章)

http://blog.csdn.net/xyw591238/article/details/51720016(以上内容部分转自此篇文章)

以上是关于Java压缩字符串的方法收集的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1078. 字符串压缩与解压

1078. 字符串压缩与解压 (20)

26 Java GC算法 垃圾收集器标记 -清除算法复制算法标记-压缩算法分代收集算法

Java 垃圾回收 - 收集算法

PAT Basic 1078

Microsoft SQL Server 代码片段收集