3 Stimmen

Können wir Daten im gzip-Format in PostgreSQL speichern?

Im Folgenden ist der Java-Code, der versucht, Daten im gzip-Format in einer Tabelle "TESTBYTEA" zu speichern. Ich benutze die PostgreSQL-Datenbank. Die TESTBYTEA-Tabelle hat eine Spalte "data" vom Typ BYTEA. Ich möchte die Daten komprimieren und speichern. Beim Lesen aus der Datenbank möchte ich sie entkomprimieren und lesen. Aber ich bekomme eine Ausnahme "Nicht im GZIP-Format".

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;
}

Aber ich bekomme die folgende Ausnahme

Ausnahme im Thread "main" java.io.IOException: Nicht im GZIP-Format
    at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:141)
    at java.util.zip.GZIPInputStream.(GZIPInputStream.java:56)
    at java.util.zip.GZIPInputStream.(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-Ergebnis: 1

Jede Hilfe in Bezug darauf wird geschätzt.

3voto

beny23 Punkte 33277

Ihr Problem liegt darin, wie Sie die Bytes einfügen:

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

wird etwas ähnliches produzieren wie

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

(im Wesentlichen wird der byte[] -Verweis in dem .toString() für Ihr Byte-Array verwendet.

Warum verwenden Sie keinen Prepared Statement?

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

BEARBEITEN:

vergessen Sie nicht:

pstmt.close();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X