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

标签 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
    }
}

最佳答案

正如您所发现的,您无法在不损坏的情况下将二进制数据存储在 CLOB 中,因此需要编码为文本。

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

关于java - 压缩字符串并将其作为字符串存储在数据库中以供以后解压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18450246/

相关文章:

java - 关闭 Quartz 调度程序

Java在使用while循环比较最大和最小数字及总和时出现计算错误

.net - 无法为 .NET 中的 Oracle.DataAccess 加载文件或程序集

oracle - 提高 SQL Exists 的可扩展性

c# - C#/.Net 的压缩程序集?

algorithm - 如何在不阅读其全部内容的情况下跟踪压缩文件?

java - 将具有不同数据类型的文件读入树中

java - 如何从 SwingWorker doInBackground 内部调用 JFileChooser 并等待答案?

sql-server - 如何将Oracle包转换为SQL Server?

压缩字节数组