一、緣起
mysql在存儲大文本時,有blob、text、mediumblob、mediumtext等字段類型可選。
最大值 | 對大小寫是否敏感 | |
---|---|---|
blob | 64k | Y |
text | 64k | N |
mediumblob | 16M | Y |
mediumtext | 16M | N |
當下業務相對粗獷, 對html網頁采用"先存儲后使用", 原始數據留有備份, 方便多次使用。而網頁是純文本型, 類似博客評論,但實際大部分大小超過80KB,故先用gzip壓縮算法處理網頁, 然后存儲壓縮后的文本。(gzip在此場景下的壓縮率接近70%, html壓縮后大小普遍在10k之內)。現需要解碼該文本, 還原原html並進行數據解析提取操作. 網上查閱知大部分python處理gzip字符串就是使用gzip的decompress、StringIO、zlib等等,但都不適用本場景. 下方給出python版處理,順便貼出參考的java代碼。
二、python代碼
def my_ungzip(in_str):
decode_str = base64.decodebytes(in_str) # 先使用base64解碼,不然會報header check等錯誤
s = zlib.decompress(decode_str, 16 + zlib.MAX_WBITS).decode()
print("gzip字符串解碼后:\n", s)
return s
代碼運行結果如下:
三、參考的java版代碼
本次參考的java,實測可行.
import org.apache.commons.lang.StringUtils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Base64;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
* @author zmh
* @date 2020-01-07
* <p>
* Gzip壓縮字符串工具類
*/
class GzipUtils {
public static final String GZIP_ENCODE_UTF_8 = "UTF-8";
/**
* base64 編碼
*
* @param bytes 傳入bytes
* @return 編碼成string類型的base64返回
*/
public static String base64encode(byte[] bytes) {
return new String(Base64.getEncoder().encode(bytes));
}
/**
* base64 解碼
*
* @param string 傳入string類型的base64編碼
* @return 解碼成byte類型返回
*/
public static byte[] base64decode(String string) {
return Base64.getDecoder().decode(string);
}
/**
* 壓縮字符串
*
* @param string 需要壓縮的字符串
* @return 壓縮后內容 並轉base64 返回
*/
public static String gzip(String string) {
String result = "";
if (StringUtils.isBlank(string)) {
return result;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip;
try {
gzip = new GZIPOutputStream(out);
gzip.write(string.getBytes(GZIP_ENCODE_UTF_8));
gzip.close();
out.close();
result = base64encode(out.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 解壓縮字符串
*
* @param string base64格式的壓縮后字符串
* @return 解碼並解壓縮后返回
*/
public static String unGzip(String string) {
String result = "";
if (StringUtils.isBlank(string)) {
return result;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in;
GZIPInputStream ungzip;
byte[] bytes = base64decode(string);
try {
in = new ByteArrayInputStream(bytes);
ungzip = new GZIPInputStream(in);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = ungzip.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
ungzip.close();
out.close();
in.close();
result = out.toString(GZIP_ENCODE_UTF_8);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static void main(String[] args) {
long temp = System.currentTimeMillis();
String test = "Gzip壓壓壓壓縮縮縮縮縮測試測試測試測試測試試試試試試試試試試試aaaabbbbbccccccaaaabbbbbccccccaaaabbbbbccccccdddddd111111111111111111111111111111111111111";
String gzip = gzip(test);
String unGzip = unGzip(gzip);
System.out.println("原文:" + test);
System.out.println("Gzip壓縮:" + gzip);
System.out.println("Gzip解壓:" + unGzip);
System.out.println("整體消耗時間: " + (System.currentTimeMillis() - temp) + " ms");
}
}
如果更佳便捷的方式方法, 歡迎留言探討,謝謝~!