如何在Java中压缩字符串?

2022-08-31 16:42:51

我使用 或 压缩字符串(my 小于 20),但压缩结果比原始字符串长。GZIPOutputStreamZIPOutputStreamstring.length()

在一些网站上,我发现有朋友说,这是因为我原来的字符串太短,可以用来压缩较长的字符串。GZIPOutputStream

那么,有人可以帮我压缩一个字符串吗?

我的函数是这样的:

String compress(String original) throws Exception {

}

更新:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import java.util.zip.*;


//ZipUtil 
public class ZipUtil {
    public static String compress(String str) {
        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 void main(String[] args) throws IOException {
        String string = "admin";
        System.out.println("after compress:");
        System.out.println(ZipUtil.compress(string));
    }
}

结果是:

alt text


答案 1

压缩算法几乎总是具有某种形式的空间开销,这意味着它们仅在压缩数据时才有效,该数据足够大,以至于开销小于节省的空间量。

压缩一个只有20个字符长的字符串并不容易,而且并不总是可能的。如果你有重复,霍夫曼编码或简单的运行长度编码可能能够压缩,但可能不是很多。


答案 2

创建字符串时,可以将其视为 char 的列表,这意味着对于 String 中的每个字符,您需要支持 char 的所有可能值。来自太阳文档

char:char 数据类型是单个 16 位 Unicode 字符。它的最小值为“\u0000”(或 0),最大值为“\uffff”(或 65,535(包括 65,535)。

如果您有一组要支持的简化字符,则可以编写一个简单的压缩算法,该算法类似于二进制>十进制>十六进制基数转换。您将从65,536(或您的目标系统支持的任意数量的字符)变为26(按字母顺序)/ 36(字母数字)等。

我已经使用过这个技巧几次了,例如将时间戳编码为文本(目标36 +,源10) - 只要确保你有足够的单元测试!