2011-07-19 81 views
4

我想壓縮我的字符串值的字符串。這些字符串值應與.net壓縮字符串相同。壓縮使用GZIPOutputStream

我寫了解壓縮方法和當我發送一個.net壓縮字符串,它工作正常。但壓縮方法無法正常工作。

public static String Decompress(String zipText) throws IOException { 
    int size = 0; 
    byte[] gzipBuff = Base64.decode(zipText); 

    ByteArrayInputStream memstream = new ByteArrayInputStream(gzipBuff, 4, 
      gzipBuff.length - 4); 
    GZIPInputStream gzin = new GZIPInputStream(memstream); 

    final int buffSize = 8192; 
    byte[] tempBuffer = new byte[buffSize]; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    while ((size = gzin.read(tempBuffer, 0, buffSize)) != -1) { 
     baos.write(tempBuffer, 0, size); 
    } 
    byte[] buffer = baos.toByteArray(); 
    baos.close(); 

    return new String(buffer, "UTF-8"); 
} 

-

public static String Compress(String text) throws IOException { 

    byte[] gzipBuff = EncodingUtils.getBytes(text, "UTF-8"); 

    ByteArrayOutputStream bs = new ByteArrayOutputStream(); 

    GZIPOutputStream gzin = new GZIPOutputStream(bs); 

    gzin.write(gzipBuff); 

    gzin.finish(); 
    bs.close(); 

    byte[] buffer = bs.toByteArray(); 

    gzin.close(); 

    return Base64.encode(buffer); 
} 

例如當我發送「BQAAAB + LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee ++ 997o7nU4n99 // P1xmZAFs9s5K2smeIYCqyB8/fnwfPyLmeVlW/W + GphA2BQAAAA ==」解壓方法它返回字符串「你好」,但是當我送「你好」壓縮方法,它返回「H4sIAAAAAAAAAMtIzcnJBwCGphA2BQAAAA ==」

什麼是壓縮方法的問題????

回答

0

我與Java虛擬機試過我想的結果是一樣的。 使用這條線在您的壓縮方法的末尾:

return new String(base64.encode(buffer), "UTF-8"); 
+0

在機器人抱歉構造函數字符串(字符串,字符串)是未定義 – breceivemail

+0

文檔說說encodeToString()方法:[Base64.html](http://developer.android.com/reference/android/util /Base64.html#encode%28byte[],%20int%29)。我無法嘗試,我無法在我的電腦上安裝android。 – revo

3

檢查Use Zip Stream and Base64 Encoder to Compress Large String Data

有關如何使用GZIPOutputStream/GZIInputStream和的Base64編碼器和解碼器來壓縮和解壓大的字符串數據,因此它可以被傳遞作爲http響應中的文本。

public static String compressString(String srcTxt) throws IOException { 
    ByteArrayOutputStream rstBao = new ByteArrayOutputStream(); 
    GZIPOutputStream zos = new GZIPOutputStream(rstBao); 
    zos.write(srcTxt.getBytes()); 
    IOUtils.closeQuietly(zos); 

    byte[] bytes = rstBao.toByteArray(); 
    return Base64.encodeBase64String(bytes); 
} 

或者我們可以使用Use Zip Stream and Base64 Encoder to Compress Large String Data來避免將整個字符串加載到內存中。

public static String uncompressString(String zippedBase64Str) throws IOException { 
    String result = null; 
    byte[] bytes = Base64.decodeBase64(zippedBase64Str); 
    GZIPInputStream zi = null; 
    try { 
    zi = new GZIPInputStream(new ByteArrayInputStream(bytes)); 
    result = IOUtils.toString(zi); 
    } finally { 
    IOUtils.closeQuietly(zi); 
    } 
    return result; 
} 
+0

請嘗試讀取這個http://stackoverflow.com/help/deleted-answers,以獲得更多的理解如何** **不回答。即:「不能從根本上回答問題的答案」:**僅僅是一個鏈接到外部網站** –