2

我有一个巨大的字符串,我需要在某处缓存,因为我无法写入文件,我唯一的选择是将其作为文本存储在数据库中,更具体地说,在我拥有的 clob 中,我将 JSON 文件存储在我的位置m 将压缩字符串放在该 JSON 对象的某个键下。

我正在压缩字符串,但是在字符串操作的某个地方发生了一些事情,不允许我解压缩数据,所以我想知道我是否应该将数据编码为 base 64,但这会失去压缩。

我可以做些什么来确保我可以将压缩字符串存储在数据库中,以便以后可以获取它?

我无法更改数据库,所以我被那个 CLOB 字段卡住了

这些是我的压缩功能:

public static String compress(String text) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        OutputStream out = new DeflaterOutputStream(baos);
        out.write(text.getBytes("UTF-8"));
        out.close();
    } catch (IOException e) {
        //ooops
    }
    return baos.toString();
}

public static String decompress(String bytes) {
    InputStream in = new InflaterInputStream(new ByteArrayInputStream(bytes.getBytes()));
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        byte[] buffer = new byte[8192];
        int len;
        while ((len = in.read(buffer)) > 0)
            baos.write(buffer, 0, len);
        return new String(baos.toByteArray(), "UTF-8");
    } catch (IOException e) {
        //ooops
    }
}
4

3 回答 3

2

正如您所发现的,您无法将二进制数据存储在 CLOB 中而不会出现一些损坏,因此需要对文本进行编码。

Base 64 平均会增加 33% 的二进制数据大小。所以你会失去一些压缩,但如果你的压缩率大于 25%(这对于特定类型的文本字符串通常很容易),那么压缩后跟 base 64 编码可能会为你提供净存储增益。很多CPU使用虽然......

于 2013-08-26T18:19:40.987 回答
1

您不能将任意二进制数据转换为字符串而不破坏它。正如您已经说过的,如果要将数据存储在 clob 中,则需要对数据进行 base64 编码(或使用其他一些有效的二进制文本编码)。

于 2013-08-26T18:13:38.893 回答
0

您是否想过其他解决方案,例如使用 memcached 或其他缓存系统?或者你真的想搞乱压缩?

于 2013-08-26T18:23:47.587 回答