添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
public static String compress ( String str ) { if ( str == null || str . length ( ) == 0 ) { return str ; ByteArrayOutputStream out = new ByteArrayOutputStream ( ) ; GZIPOutputStream gzip = null ; try { gzip = new GZIPOutputStream ( out ) ; gzip . write ( str . getBytes ( ) ) ; } catch ( IOException e ) { e . printStackTrace ( ) ; } finally { if ( gzip != null ) { try { gzip . close ( ) ; } catch ( IOException e ) { e . printStackTrace ( ) ; return new sun . misc . BASE64Encoder ( ) . encode ( out . toByteArray ( ) ) ; * 使用gzip解压缩 * @param compressedStr 压缩字符串 * @return public static String uncompress ( String compressedStr ) { if ( compressedStr == null ) { return null ; ByteArrayOutputStream out = new ByteArrayOutputStream ( ) ; ByteArrayInputStream in = null ; GZIPInputStream ginzip = null ; byte [ ] compressed = null ; String decompressed = null ; try { compressed = new sun . misc . BASE64Decoder ( ) . decodeBuffer ( compressedStr ) ; in = new ByteArrayInputStream ( compressed ) ; ginzip = new GZIPInputStream ( in ) ; byte [ ] buffer = new byte [ 1024 ] ; int offset = - 1 ; while ( ( offset = ginzip . read ( buffer ) ) != - 1 ) { out . write ( buffer , 0 , offset ) ; decompressed = out . toString ( ) ; } catch ( IOException e ) { e . printStackTrace ( ) ; } finally { if ( ginzip != null ) { try { ginzip . close ( ) ; } catch ( IOException e ) { if ( in != null ) { try { in . close ( ) ; } catch ( IOException e ) { if ( out != null ) { try { out . close ( ) ; } catch ( IOException e ) { return decompressed ;

方法二:用org.apache.commons.codec.binary.Base64

* 使用org.apache.commons.codec.binary.Base64压缩字符串 * @param str 要压缩的字符串 * @return public static String compress ( String str ) { if ( str == null || str . length ( ) == 0 ) { return str ; return Base64 . encodeBase64String ( str . getBytes ( ) ) ; * 使用org.apache.commons.codec.binary.Base64解压缩 * @param compressedStr 压缩字符串 * @return public static String uncompress ( String compressedStr ) { if ( compressedStr == null ) { return null ; return Base64 . decodeBase64 ( compressedStr ) ;

在web项目中,服务器端将加密后的字符串返回给前端,前端再通过ajax请求将加密字符串发送给服务器端处理的时候,在http传输过程中会改变加密字符串的内容,导致服务器解压压缩字符串发生异常:

java.util.zip.ZipException: Not in GZIP format

解决方法:

在字符串压缩之后,将压缩后的字符串BASE64加密,在使用的时候先BASE64解密再解压即可

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPInputStream; import java.... import java.io.*; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; * GZIP工具类 * @author [email protected] * @date 2019/7/19 下午7:03 public... // 使用GZIP算法压缩字符串 ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(baos); gzip.write(str.getBytes("UTF-8")); gzip.close(); byte[] compressedData = baos.toByteArray(); // 将压缩后的字节流保存数据库中 // 假设使用JDBC连接MySQL数据库 String url = "jdbc:mysql://localhost:3306/mydb"; String username = "root"; String password = "password"; Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement stmt = conn.prepareStatement("INSERT INTO mytable (compressed_data) VALUES (?)"); stmt.setBytes(1, compressedData); stmt.executeUpdate(); stmt.close(); conn.close(); 注意,当从数据库中读取压缩后的数据时,需要使用GZIP解压缩算法将压缩后的字节流解压缩为原始字符串。以下是一个简单的示例代码: ```java // 从数据库中读取压缩后的数据 // 假设使用JDBC连接MySQL数据库 String url = "jdbc:mysql://localhost:3306/mydb"; String username = "root"; String password = "password"; Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement stmt = conn.prepareStatement("SELECT compressed_data FROM mytable WHERE id=?"); stmt.setInt(1, 1); ResultSet rs = stmt.executeQuery(); rs.next(); byte[] compressedData = rs.getBytes(1); rs.close(); stmt.close(); conn.close(); // 使用GZIP算法解压缩数据 ByteArrayInputStream bais = new ByteArrayInputStream(compressedData); GZIPInputStream gzip = new GZIPInputStream(bais); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = gzip.read(buffer)) > 0) { baos.write(buffer, 0, len); gzip.close(); baos.close(); String str = new String(baos.toByteArray(), "UTF-8"); System.out.println(str); // 输出 "Hello, world!"