我需要帮助压缩和解压缩字符串。
当我尝试压缩较小的字符串时,它会转换为更大的字节,然后是原始大小。 但是当我添加更大的字符串时,它会以较小的字节压缩。
我在下面给出了我的代码:
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);
}
}
答案 0 :(得分:2)
不要压缩短字符串,因为GZIP只能在输入的特定大小以上工作,可能是18或更多,见下文。如果长度超过未压缩,请设置长度阈值或丢弃压缩版本。
在您需要解压缩时,请在字符串的开头查找GZIP header magic sequence,(0x1f, 0x8b
)。如果不存在,则字符串不会被压缩,应该“按原样”返回。
从这个神奇序列开始的字符串必须独立于其大小进行压缩(应该很少,因为两个字节都不是可打印的ASCII符号)。
当然,魔术序列之后的第一个字节指定格式,并且有一个选项“存储”(未压缩)。但是,如果你有很多只是空或非常短的字符串,这可能不够好,因为gzip有一个10字节的标题和一个8字节的页脚。