1 package util;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.ByteArrayOutputStream;
5 import java.io.File;
6 import java.io.FileInputStream;
7 import java.io.FileOutputStream;
8 import java.io.InputStream;
9 import java.io.OutputStream;
10 import java.util.zip.GZIPInputStream;
11 import java.util.zip.GZIPOutputStream;
12
13
14 public class GZipUtils {
15 public static final int BUFFER = 1024;
16 public static final String EXT = ".gz";
17
18 /**
19 * 数据压缩
20 * @param data
21 * @return
22 * @throws Exception
23 */
24 public static byte[] compress(byte[] data) throws Exception{
25 byte[] output = null;
26 ByteArrayInputStream bais = new ByteArrayInputStream(data);
27 ByteArrayOutputStream baos = new ByteArrayOutputStream();
28 // 压缩
29 compress(bais, baos);
30 output = baos.toByteArray();
31
32 baos.flush();
33 baos.close();
34
35 bais.close();
36 return output;
37 }
38
39 /**
40 * 文件压缩
41 *
42 * @param file
43 * @throws Exception
44 */
45 public static void compress(File file) throws Exception {
46 compress(file, true);
47 }
48
49 /**
50 * 文件压缩
51 *
52 * @param file
53 * @param delete
54 * 是否删除原始文件
55 * @throws Exception
56 */
57 public static void compress(File file, boolean delete) throws Exception {
58 FileInputStream fis = new FileInputStream(file);
59 FileOutputStream fos = new FileOutputStream(file.getPath() + EXT);
60
61 compress(fis, fos);
62
63 fis.close();
64 fos.flush();
65 fos.close();
66
67 if (delete) {
68 boolean fal=file.delete();
69 }
70 }
71
72 /**
73 * 数据压缩
74 *
75 * @param is
76 * @param os
77 * @throws Exception
78 */
79 public static void compress(InputStream is, OutputStream os)
80 throws Exception {
81
82 GZIPOutputStream gos = new GZIPOutputStream(os);
83
84 int count;
85 byte data[] = new byte[BUFFER];
86 while ((count = is.read(data, 0, BUFFER)) != -1) {
87 gos.write(data, 0, count);
88 }
89
90 gos.finish();
91
92 gos.flush();
93 gos.close();
94 }
95
96 /**
97 * 文件压缩
98 *
99 * @param path
100 * @throws Exception
101 */
102 public static void compress(String path) throws Exception {
103 compress(path, true);
104 }
105
106 /**
107 * 文件压缩
108 *
109 * @param path
110 * @param delete
111 * 是否删除原始文件
112 * @throws Exception
113 */
114 public static void compress(String path, boolean delete) throws Exception {
115 File file = new File(path);
116 compress(file, delete);
117 }
118
119 /**
120 * 数据解压
121 *
122 * @param data
123 * @return
124 * @throws Exception
125 */
126 public static byte[] decompress(byte[] data) throws Exception {
127 ByteArrayInputStream bais = new ByteArrayInputStream(data);
128 ByteArrayOutputStream baos = new ByteArrayOutputStream();
129
130 // 解压
131
132 decompress(bais, baos);
133
134 data = baos.toByteArray();
135
136 baos.flush();
137 baos.close();
138
139 bais.close();
140
141 return data;
142 }
143
144 /**
145 * 数据解压
146 *
147 * @param is
148 * @param os
149 * @throws Exception
150 */
151 public static void decompress(InputStream is, OutputStream os)
152 throws Exception {
153 GZIPInputStream gis = new GZIPInputStream(is);
154 int count;
155 byte data[] = new byte[BUFFER];
156 while ((count = gis.read(data, 0, BUFFER)) != -1) {
157 os.write(data, 0, count);
158 }
159
160 gis.close();
161 }
162
163 }
有同事写解压方法的时候直接返回 String 类型,再获取 byte 用 base64 包装,事实说明
ByteArrayOutputStream.toByteArray 输出的结果一般情况下并不能转成 String 类型再转回 byte 类型。
参考:https://zhidao.baidu.com/question/1540471893185651307.html
byte数组转字符串在特定情况下是可以的,byte的内容全部可以用字符表示,否则的话,转换的时候,有些无法用字符表示的数据,在转换的过程中就会出现问题。
如果需要转字符串,可以对byte数组进行base六十四编码,这个base六十四编码的byte可以全部用字符表示,转成字符串,需要的时候,把字符串进行base六十四解密,可以得到原来的byte数组