0

可能重复:
短文本字符串的最佳压缩算法

我在压缩和解压缩字符串方面需要帮助。

当我尝试压缩较小的字符串时,它会转换为比原始大小更多的字节。但是当我添加更大的字符串时,它会以更少的字节压缩。

我在下面给出我的代码:

package string_compress;

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



 //@author Administrator

   public class Main
  {

   public static String compress(String str) throws IOException {
     if (str == null || str.length() == 0) {
        return str;
    }
    System.out.println("String length : " + str.length());
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    GZIPOutputStream gzip = new GZIPOutputStream(out);
     gzip.write(str.getBytes());

    gzip.close();

   String outStr = out.toString("ISO-8859-1");//ISO-8859-1
    System.out.println("Output String lenght : " + outStr.length());

    return outStr;
   }

   public static String decompress(String str) throws IOException {
    if (str == null || str.length() == 0) {
        return str;
    }
    System.out.println("Input String length : " + str.length());
    GZIPInputStream gis = new GZIPInputStream(new   ByteArrayInputStream(str.getBytes("ISO-8859-1")));
    BufferedReader bf = new BufferedReader(new InputStreamReader(gis, "ISO-8859-1"));
    String outStr = "";
    String line;
    while ((line=bf.readLine())!=null) {
      outStr += line;
    }
    System.out.println("Output String lenght : " + outStr.length());
    return outStr;
 }
  /**
  * @param args the command line arguments
  */
 public static void main(String[] args)throws IOException {


        //String filePath = ".\response.txt";

 //   String string = getFileData(filePath);
    String string= "rishi jain is tring to compress the string";

     System.out.println("after compress:");
    String compressed = Main.compress(string);
    System.out.println(compressed);
    System.out.println("after decompress:");
    String decomp = decompress(compressed);
    System.out.println(decomp);

  }


    }
4

1 回答 1

2

不要压缩短字符串,因为 GZIP 仅适用于输入的特定大小,可能是 18 或更多,见下文。如果压缩版本比未压缩的长,则放置长度阈值或丢弃压缩版本。

在您需要解压缩时,请在字符串的开头查找GZIP 标头魔术序列( )。0x1f, 0x8b如果不存在,则字符串不会被压缩,应该“按原样”返回。

偶然从这个魔术序列开始的字符串必须独立于其大小进行压缩(应该很少见,因为两个字节都不是可打印的 ASCII 符号)。

当然,魔术序列后的第一个字节指定格式,还有一个选项“已存储”(未压缩)。但是,如果您有很多空字符串或非常短的字符串,这可能还不够好,因为 gzip 有一个 10 字节的标题和一个 8 字节的页脚。

于 2013-01-31T13:36:10.737 回答