JavaSE--压缩

  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数组

posted @ 2017-04-12 09:48  MicroCat  阅读(244)  评论(0编辑  收藏  举报