压缩字符串并将其作为字符串存储在数据库中以便以后解压缩

时间:2013-08-26 18:07:33

标签: java oracle compression

我有一个巨大的字符串,我需要在某处缓存,因为我无法写入文件,我唯一的选择是将其作为文本存储在数据库中,更具体地说,在clob我有存储JSON文件我将压缩字符串放在该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
    }
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

正如您所发现的那样,您不能在没有损坏的情况下将二进制数据存储在CLOB中,因此需要对文本进行编码。

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

答案 2 :(得分:0)

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