java - 我们可以在postgresql中以gzip格式存储数据吗

标签 java postgresql

以下是 java 代码,它试图以 gzip 格式将数据存储在表“TESTBYTEA”中。我正在使用 postgresql 数据库。 TESTBYTEA 表有一列 BYTEA 类型的“数据”。我想压缩数据并存储它。从数据库中读取时,我想解压缩并读取它。但我得到一个异常(exception)“不是 GZIP 格式”。

public static void main(String[] args){
    insertBytes(connection);        
    readBytes(connection);
    connection.close();
}

public static void insertBytes(Connection connection) throws FileNotFoundException, IOException, SQLException{
    File file = new File("C:test.txt");
    FileReader fileReader = new FileReader(file);
    char[] cbuf = new char[2000];
    int read = fileReader.read(cbuf);
    String str = new String (cbuf);
    byte[] bytes = gzip(str);
    Statement statement = connection.createStatement();
    int result = statement.executeUpdate("INSERT INTO TESTBYTEA (data) VALUES ('\\\\x"+bytes+"')");
    System.out.println(result);
}


public static void readBytes(Connection connection) throws SQLException, IOException{
    Statement statement = connection.createStatement();
    ResultSet rs = statement.executeQuery("select data from testbytea");
    while(rs.next()){
        byte[] bs = rs.getBytes(1);
        String str = gunzip(bs);
        System.out.println(str);
    }
}


private static String gunzip(byte[] bytes) throws IOException {
    Reader reader = new InputStreamReader(new GZIPInputStream(new ByteArrayInputStream(bytes)), "US-ASCII");
    StringBuffer sbuf = new StringBuffer();

    char[] buffer = new char[32 * 1024];
    int nread;
    while ((nread = reader.read(buffer)) >= 0) {
        sbuf.append(buffer, 0, nread);
    }

    String s = sbuf.toString();

    reader.close();
    return s;
}

private static byte[] gzip(String s) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    GZIPOutputStream gzos = new GZIPOutputStream(baos);
    Writer writer = new OutputStreamWriter(gzos, "US-ASCII");

    writer.write(s);
    writer.flush();
    gzos.finish();

    byte[] bytes = baos.toByteArray();

    writer.close();
    return bytes;
}

但是我得到以下异常

Exception in thread "main" java.io.IOException: Not in GZIP format
    at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:141)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:56)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:65)
    at postgresjdbc.PostgresJDBC.gunzip(PostgresJDBC.java:237)
    at postgresjdbc.PostgresJDBC.readBytes(PostgresJDBC.java:230)
    at postgresjdbc.PostgresJDBC.main(PostgresJDBC.java:208)
Java Result: 1

如有任何帮助,我们将不胜感激。

最佳答案

你的问题是你如何插入字节:

"INSERT INTO TESTBYTEA (data) VALUES ('\\\\x"+bytes+"')"

会产生类似的东西

INSERT INTO TESTBYTEA (data) VALUES ('\\x[B@187c6c7')

(本质上,byte[] 引用用于字节数组的 .toString()

为什么不使用准备好的语句?

PreparedStatement pstmt = connection.prepareStatement(
   "INSERT INTO TESTBYTEA (data) VALUES (?)");
pstmt.setBytes(1, bytes);
pstmt.executeUpdate();

编辑:

不要忘记:

pstmt.close();

关于java - 我们可以在postgresql中以gzip格式存储数据吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296032/

相关文章:

java - ANTLR3 中的自定义初始化/清理

java - 如何使用 JOOQ 正确构建动态 WHERE 子句条件?

postgresql - 在单个列中创建包含多个单词的表

sql - 如何将带有字符串的列中的空白转换为空值

Django MPTT Postgres 更新查询运行缓慢

json - PostgreSQL 选择到 JSON 数组

java - 如何使用 PDPageContentStream 底层内容流?

java - 如何将音符名称和频率存储为数据以在java中的其他类中使用

postgresql - pq 驱动程序 : prepared statement does not exist

java - 如果数据在黑莓中使用相同的压缩方式,如何在java中使用GZIP解压缩数据