package util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class GZipUtils {
public static final int BUFFER = 1024;
public static final String EXT = ".gz";
/\*\*
\* 数据压缩
\* @param data
\* @return
\* @throws Exception
\*/
public static byte\[\] compress(byte\[\] data) throws Exception{
byte\[\] output = null;
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 压缩
compress(bais, baos);
output = baos.toByteArray();
baos.flush();
baos.close();
bais.close();
return output;
}
/\*\*
\* 文件压缩
\*
\* @param file
\* @throws Exception
\*/
public static void compress(File file) throws Exception {
compress(file, true);
}
/\*\*
\* 文件压缩
\*
\* @param file
\* @param delete
\* 是否删除原始文件
\* @throws Exception
\*/
public static void compress(File file, boolean delete) throws Exception {
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file.getPath() + EXT);
compress(fis, fos);
fis.close();
fos.flush();
fos.close();
if (delete) {
boolean fal=file.delete();
}
}
/\*\*
\* 数据压缩
\*
\* @param is
\* @param os
\* @throws Exception
\*/
public static void compress(InputStream is, OutputStream os)
throws Exception {
GZIPOutputStream gos = new GZIPOutputStream(os);
int count;
byte data\[\] = new byte\[BUFFER\];
while ((count = is.read(data, 0, BUFFER)) != -1) {
gos.write(data, 0, count);
}
gos.finish();
gos.flush();
gos.close();
}
/\*\*
\* 文件压缩
\*
\* @param path
\* @throws Exception
\*/
public static void compress(String path) throws Exception {
compress(path, true);
}
/\*\*
\* 文件压缩
\*
\* @param path
\* @param delete
\* 是否删除原始文件
\* @throws Exception
\*/
public static void compress(String path, boolean delete) throws Exception {
File file = new File(path);
compress(file, delete);
}
/\*\*
\* 数据解压
\*
\* @param data
\* @return
\* @throws Exception
\*/
public static byte\[\] decompress(byte\[\] data) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 解压
decompress(bais, baos);
data = baos.toByteArray();
baos.flush();
baos.close();
bais.close();
return data;
}
/\*\*
\* 数据解压
\*
\* @param is
\* @param os
\* @throws Exception
\*/
public static void decompress(InputStream is, OutputStream os)
throws Exception {
GZIPInputStream gis = new GZIPInputStream(is);
int count;
byte data\[\] = new byte\[BUFFER\];
while ((count = gis.read(data, 0, BUFFER)) != -1) {
os.write(data, 0, count);
}
gis.close();
}
}
有同事写解压方法的时候直接返回 String 类型,再获取 byte 用 base64 包装,事实说明
ByteArrayOutputStream.toByteArray 输出的结果一般情况下并不能转成 String 类型再转回 byte 类型。
参考:https://zhidao.baidu.com/question/1540471893185651307.html
byte数组转字符串在特定情况下是可以的,byte的内容全部可以用字符表示,否则的话,转换的时候,有些无法用字符表示的数据,在转换的过程中就会出现问题。
如果需要转字符串,可以对byte数组进行base六十四编码,这个base六十四编码的byte可以全部用字符表示,转成字符串,需要的时候,把字符串进行base六十四解密,可以得到原来的byte数组
手机扫一扫
移动阅读更方便
你可能感兴趣的文章