我有一个基于文件的H2数据库(引擎版本1.4.196),其中mediumblob
列包含COMPRESS()
函数返回的数据:
create table foo (compressed_data mediumblob);
...
insert into foo (compressed_data) values (COMPRESS(STRINGTOUTF8('Test'), 'DEFLATE'));
(该表由flyway创建并填充。)
我想首先在JDBC客户端中读取此数据而不先调用DECOMPRESS()
。 (我想做解压缩客户端以与另一个系统兼容)。我试图通过InflaterInputStream
读取数据,这可以解压缩DEFLATE数据:
try (InputStream dbStream = rs.getBinaryStream("compressed_data");
InflaterInputStream inflaterStream = new InflaterInputStream(dbStream);
) {
inflaterStream.read();
...
但这会导致错误:
java.util.zip.ZipException: incorrect header check
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
...
有什么方法可以从H2中的列中获取InflaterInputStream
兼容的压缩数据?
答案 0 :(得分:1)
由于您已经使用H2 JDBC访问数据库,因此只需使用getBytes
检索压缩数据,并使用expand
org.h2.tools.CompressTool
方法解压缩它:
// .java source file is Cp1252 encoded
String sql = "SELECT COMPRESS(STRINGTOUTF8('fermé'), 'DEFLATE') AS foo";
ResultSet rs = st.executeQuery(sql);
rs.next();
byte[] bytesOut = rs.getBytes(1);
byte[] expanded = org.h2.tools.CompressTool.getInstance().expand(bytesOut);
String strOut = new String(expanded, "UTF-8");