2016-09-13 49 views
1

我想將一些字節數據插入到mysql VARBINARY列中。數據很大,所以我想以壓縮的方式存儲它。Java模擬MySQL COMRESS DECOMPRESS函數

我正在使用Percona 5.6 Mysql。我想在Java中模擬mysql的COMPRESS函數,然後將結果插入到數據庫中。 我想使用MySql DECOMPRESS函數來訪問這些數據。 有沒有辦法做到這一點?

我試過使用標準的java.zip包。但它不起作用。

編輯。換言之,什麼是PHP的gzcompress(ZLIB)的Java等價物?

+0

你的意思_it什麼不WORK_? – Prisoner

+0

添加一些東西以幫助發現答案。 –

+0

爲什麼?讓數據庫做到這一點。這就是它的目的。 – EJP

回答

1

COMPRESS的結果是未壓縮數據的四字節小端長度,後面是包含壓縮數據的zlib流。

您可以使用Java中的Deflater類壓縮到zlib流。以四字節長度爲前導結果。

+0

謝謝馬克。我遺漏的片斷是未壓縮數據的四字節長度以小尾數格式存儲。它工作得很漂亮! – Cafebabe

0

解決方案:實施MYSQL壓縮和解壓

//Compress byte stream using ZLib compression 
    public static byte[] compressZLib(byte[] data) { 
    Deflater deflater = new Deflater(); 
    deflater.setInput(data); 
    deflater.finish(); 

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); 
    byte[] buffer = new byte[1024]; 
    while (!deflater.finished()) { 
     int count = deflater.deflate(buffer); // returns the generated code... index 
     outputStream.write(buffer, 0, count); 
    } 
    try { 
     outputStream.close(); 
    } catch (IOException e) { 
    } 
    return outputStream.toByteArray(); 
    } 

//MYSQL COMPRESS. 
    public static byte[] compressMySQL(byte[] data) { 
    byte[] lengthBeforeCompression = ByteBuffer.allocate(Integer.SIZE/Byte.SIZE).order(ByteOrder.LITTLE_ENDIAN).putInt(data.length).array(); 
    ByteArrayOutputStream resultStream = new ByteArrayOutputStream(); 
    try { 
     resultStream.write(lengthBeforeCompression); 
     resultStream.write(compressZLib(data)); 
     resultStream.close(); 
    } catch (IOException e) { 
    } 
    return resultStream.toByteArray(); 
    } 

//Decompress using ZLib 
    public static byte[] decompressZLib(byte[] data) { 
    Inflater inflater = new Inflater(); 
    inflater.setInput(data); 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); 
    byte[] buffer = new byte[1024]; 
    try { 
     while (!inflater.finished()) { 
     int count = inflater.inflate(buffer); 
     outputStream.write(buffer, 0, count); 
     } 
     outputStream.close(); 
    }catch (IOException ioe) { 
    } catch (DataFormatException e) { 
    } 
    return outputStream.toByteArray(); 
    } 

    //MYSQL DECOMPRESS 
    public static byte[] decompressSQLCompression(byte[] input) { 
    //ignore first four bytes which denote length of uncompressed data. use rest of the array for decompression 
    byte[] data= Arrays.copyOfRange(input,4,input.length); 
    return decompressZLib(data); 
    }