错误:不是 GZIP 格式 - 尝试解压缩先前存储在数据库字段中的 GZIP 流

问题描述 投票:0回答:1

流媒体让我感到困惑 - 就在我认为我已经掌握了这个想法时,我的代码却崩溃了。

我正在尝试接收一个字符串,对其进行 gzip 压缩,并将其存储在 PostGreSQL 数据库中。然后我想将其取出并将其重新转换为输出流。当我尝试将流读入 GZIPstream 时,错误发生在我的“get”函数中。错误是:

java.util.zip.ZipException:不是 GZIP 格式

以下是用于压缩字符串然后将其放入数据库的函数:

public Jstruct_FileImportRun setSnapshotXml(String inValue) throws IOException
{
    return setSnapshotXml(new BufferedInputStream(new ByteArrayInputStream(inValue.getBytes())));
}

public Jstruct_FileImportRun setSnapshotXml(BufferedInputStream inValue)
{
    try
    {
        ByteArrayOutputStream compressedBytes = new ByteArrayOutputStream(30000 * 1024);
        GZIPOutputStream gzipStream = new GZIPOutputStream(compressedBytes);

        byte[] transferBuffer = new byte[32 * 1024];
        int readSize;
        while ((readSize = inValue.read(transferBuffer)) != -1)
        {
            gzipStream.write(transferBuffer, 0, readSize);
        }
        inValue.close();
        gzipStream.close();

        getField(SNAPSHOT_XML).setValue(compressedBytes.toByteArray());
    }
    catch (IOException e)
    {
        throw new JstructException(e);
    }

    return this;
}

这是我尝试检索它时的代码(引发错误):

public static void getSnapshotXml(Connection inConn, Long inRunId, OutputStream inOutputStream) throws Exception
{
    SQLQuery query = new SQLQuery()
            .addSelect(SNAPSHOT_XML)
            .addFrom(getTable())
            .addWhereClause(FILE_IMPORT_RUN_ID + " = " + inRunId);

    ResultSet rs = null;
    try
    {
        rs = query.execute(inConn);
        if (rs.next())
        {
            InputStream stream = rs.getBinaryStream(SNAPSHOT_XML.name());
            GZIPInputStream gzipStream = new GZIPInputStream(stream);

            byte[] transferBuffer = new byte[32 * 1024];
            int readSize;
            while ((readSize = gzipStream.read(transferBuffer)) != -1)
            {
                inOutputStream.write(transferBuffer, 0, readSize);
            }

            gzipStream.close();
            inOutputStream.close();
        }
    }
    finally
    {
        SQLUtil.closeResultSetAndStatement(rs);
    }

}

再次,错误“java.util.zip.ZipException: Not in GZIP format”发生在“GZIPInputStream gzipStream = new GZIPInputStream(stream);”行中

停下来!!我做错了什么?

java postgresql gzipstream gzipinputstream gzipoutputstream
1个回答
0
投票

确保您的列是 blob 或 varbinary 类型 并验证您的单元格字符集/排序规则是否为二进制。

我怀疑正在进行一些不需要的转换,因为它在构造时失败(早期字节),

这不太可能是静默长度截断,但请确保您不会静默这些长度,并且您的列有足够的长度(您的目标似乎约为 30 MB)。

© www.soinside.com 2019 - 2024. All rights reserved.