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!"