Java压缩文件

Posted 溪山晴雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java压缩文件相关的知识,希望对你有一定的参考价值。

压缩文件

  1 package com.iss.cpf.windmanger.userprivilegeexport.bizlogic;
  2 
  3 import java.io.BufferedInputStream;
  4 import java.io.BufferedOutputStream;
  5 import java.io.File;
  6 import java.io.FileInputStream;
  7 import java.io.FileOutputStream;
  8 import java.io.IOException;
  9 import java.util.Enumeration;
 10 import java.util.zip.CRC32;
 11 import java.util.zip.CheckedOutputStream;
 12 import java.util.zip.ZipFile;
 13 
 14 import org.apache.commons.lang.StringUtils;
 15 import org.apache.tools.zip.ZipEntry;
 16 import org.apache.tools.zip.ZipOutputStream;
 17 
 18 public class ZipBiz {
 19 
 20     
 21     /**
 22      * 递归压缩文件夹
 23      * @param srcRootDir 压缩文件夹根目录的子路径
 24      * @param file 当前递归压缩的文件或目录对象
 25      * @param zos 压缩文件存储对象
 26      * @throws Exception
 27      */
 28     private static void zip(String srcRootDir, File file, ZipOutputStream zos) throws Exception
 29     {
 30         if (file == null) 
 31         {
 32             return;
 33         }                
 34         
 35         //如果是文件,则直接压缩该文件
 36         if (file.isFile())
 37         {            
 38             int count, bufferLen = 1024;
 39             byte data[] = new byte[bufferLen];
 40         
 41             
 42             //获取文件相对于压缩文件夹根目录的子路径
 43             String subPath = file.getAbsolutePath();
 44             int index = subPath.indexOf(srcRootDir);
 45             if (index != -1) 
 46             {
 47                 subPath = subPath.substring(srcRootDir.length() + File.separator.length());
 48             }
 49             ZipEntry entry = new ZipEntry(subPath);
 50             entry.setUnixMode(644);//解决Linux乱码
 51             zos.putNextEntry(entry);
 52             zos.setEncoding("GBK");
 53             BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
 54             while ((count = bis.read(data, 0, bufferLen)) != -1) 
 55             {
 56                 zos.write(data, 0, count);
 57             }
 58             bis.close();
 59             zos.closeEntry();
 60         }
 61         //如果是目录,则压缩整个目录
 62         else 
 63         {
 64             //压缩目录中的文件或子目录
 65             File[] childFileList = file.listFiles();
 66             for (int n=0; n<childFileList.length; n++)
 67             {
 68                 childFileList[n].getAbsolutePath().indexOf(file.getAbsolutePath());
 69                 zip(srcRootDir, childFileList[n], zos);
 70             }
 71         }
 72     }
 73     
 74     /**
 75      * 对文件或文件目录进行压缩
 76      * @param srcPath 要压缩的源文件路径。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径
 77      * @param zipPath 压缩文件保存的路径。注意:zipPath不能是srcPath路径下的子文件夹
 78      * @param zipFileName 压缩文件名
 79      * @throws Exception
 80      */
 81     public static void zip(String srcPath, String zipPath, String zipFileName) throws Exception
 82     {
 83         if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(zipPath) || StringUtils.isEmpty(zipFileName))
 84         {
 85             throw new Exception("路径不正确");
 86         }
 87         CheckedOutputStream cos = null;
 88         ZipOutputStream zos = null;                        
 89         try
 90         {
 91             File srcFile = new File(srcPath);
 92             
 93             //判断压缩文件保存的路径是否为源文件路径的子文件夹,如果是,则抛出异常(防止无限递归压缩的发生)
 94             //若果是本地  路径是从配置文件读取的   /    会导致报错
 95             if (srcFile.isDirectory() && zipPath.indexOf(srcPath)>0) 
 96             {
 97                 throw new Exception("zipPath must not be the child directory of srcPath= "+srcFile);
 98             }
 99             
100             //判断压缩文件保存的路径是否存在,如果不存在,则创建目录
101             File zipDir = new File(zipPath);
102             if (!zipDir.exists() || !zipDir.isDirectory())
103             {
104                 zipDir.mkdirs();
105             }
106             
107             //创建压缩文件保存的文件对象
108             String zipFilePath = zipPath + File.separator + zipFileName;
109             File zipFile = new File(zipFilePath);            
110             if (zipFile.exists())
111             {
112                 //检测文件是否允许删除,如果不允许删除,将会抛出SecurityException
113                 SecurityManager securityManager = new SecurityManager();
114                securityManager.checkDelete(zipFilePath);
115                 //删除已存在的目标文件
116                 zipFile.delete();                
117             }
118             
119             cos = new CheckedOutputStream(new FileOutputStream(zipFile), new CRC32());
120             zos = new ZipOutputStream(cos);
121             
122             //如果只是压缩一个文件,则需要截取该文件的父目录
123             String srcRootDir = srcPath;
124             if (srcFile.isFile())
125             {
126                 int index = srcPath.lastIndexOf(File.separator);
127                 if (index != -1)
128                 {
129                     srcRootDir = srcPath.substring(0, index);
130                 }
131             }
132             //调用递归压缩方法进行目录或文件压缩
133             zip(srcRootDir, srcFile, zos);
134             zos.flush();
135         }
136         catch (Exception e) 
137         {
138             throw e;
139         }
140         finally 
141         {            
142             try
143             {
144                 if (zos != null)
145                 {
146                     zos.close();
147                 }                
148             }
149             catch (Exception e)
150             {
151                 e.printStackTrace();
152             }            
153         }
154     }
155     
156     /**
157      * 解压缩zip包
158      * @param zipFilePath zip文件的全路径
159      * @param unzipFilePath 解压后的文件保存的路径
160      * @param includeZipFileName 解压后的文件保存的路径是否包含压缩文件的文件名。true-包含;false-不包含
161      */
162     @SuppressWarnings("unchecked")
163     public static void unzip(String zipFilePath, String unzipFilePath, boolean includeZipFileName) throws Exception
164     {
165         if (StringUtils.isEmpty(zipFilePath) || StringUtils.isEmpty(unzipFilePath))
166         {
167             throw new Exception("路径为空");            
168         }
169         File zipFile = new File(zipFilePath);
170         //如果解压后的文件保存路径包含压缩文件的文件名,则追加该文件名到解压路径
171         if (includeZipFileName)
172         {
173             String fileName = zipFile.getName();
174             if (StringUtils.isNotEmpty(fileName))
175             {
176                 fileName = fileName.substring(0, fileName.lastIndexOf("."));
177             }
178             unzipFilePath = unzipFilePath + File.separator + fileName;
179         }
180         //创建解压缩文件保存的路径
181         File unzipFileDir = new File(unzipFilePath);
182         if (!unzipFileDir.exists() || !unzipFileDir.isDirectory())
183         {
184             unzipFileDir.mkdirs();
185         }
186         
187         //开始解压
188         ZipEntry entry = null;
189         String entryFilePath = null, entryDirPath = null;
190         File entryFile = null, entryDir = null;
191         int index = 0, count = 0, bufferSize = 1024;
192         byte[] buffer = new byte[bufferSize];
193         BufferedInputStream bis = null;
194         BufferedOutputStream bos = null;
195         ZipFile zip = new ZipFile(zipFile);
196         Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>)zip.entries();
197         //循环对压缩包里的每一个文件进行解压        
198         while(entries.hasMoreElements())
199         {
200             entry = entries.nextElement();
201             //构建压缩包中一个文件解压后保存的文件全路径
202             entryFilePath = unzipFilePath + File.separator + entry.getName();
203             //构建解压后保存的文件夹路径
204             index = entryFilePath.lastIndexOf(File.separator);
205             if (index != -1)
206             {
207                 entryDirPath = entryFilePath.substring(0, index);
208             }
209             else
210             {
211                 entryDirPath = "";
212             }            
213             entryDir = new File(entryDirPath);
214             //如果文件夹路径不存在,则创建文件夹
215             if (!entryDir.exists() || !entryDir.isDirectory())
216             {
217                 entryDir.mkdirs();
218             }
219             
220             //创建解压文件
221             entryFile = new File(entryFilePath);
222             if (entryFile.exists())
223             {
224                 //检测文件是否允许删除,如果不允许删除,将会抛出SecurityException
225                 SecurityManager securityManager = new SecurityManager();
226                 securityManager.checkDelete(entryFilePath);
227                 //删除已存在的目标文件
228                 entryFile.delete();    
229             }
230             
231             //写入文件
232             bos = new BufferedOutputStream(new FileOutputStream(entryFile));
233             bis = new BufferedInputStream(zip.getInputStream(entry));
234             while ((count = bis.read(buffer, 0, bufferSize)) != -1)
235             {
236                 bos.write(buffer, 0, count);
237             }
238             bos.flush();
239             bos.close();            
240         }
241     }
242     /**
243      * 复制文件
244      * @param fromFile
245      * @param toFile
246      * <br/>
247      * 2018年4月9日  下午3:31:50
248      * @throws IOException 
249      */
250     public void copyFile(File fromFile,File toFile) throws IOException{
251         //如果目标文件不存在,则创建
252         File parentFile = toFile.getParentFile();
253         if(!parentFile.exists()){
254             parentFile.mkdirs();
255         }
256         if(!toFile.exists()){
257             toFile.createNewFile();
258         }
259         //复制文件
260         FileInputStream ins = new FileInputStream(fromFile);
261         FileOutputStream out = new FileOutputStream(toFile);
262         byte[] b = new byte[1024];
263         int n=0;
264         while((n=ins.read(b))!=-1){
265             out.write(b, 0, n);
266         }
267         
268         ins.close();
269         out.close();
270     }
271  
272     public static void main(String[] args) 
273     {
274         String zipPath = "/appshare/cpfupload/windmanger/userManageExport/17/zip";
275         String dir = "/appshare/cpfupload/windmanger/userManageExport/17";
276 //        String zipFileName = "test.zip";
277 
278         
279         long i=zipPath.indexOf(dir);
280         
281         
282         System.out.print(i);
283         
284         String zipFilePath = "D:\\ziptest\\zipPath\\test.zip";
285         String unzipFilePath = "D:\\ziptest\\zipPath";
286         try 
287         {
288 //            unzip(zipFilePath, unzipFilePath, true);
289         }
290         catch (Exception e)
291         {
292             e.printStackTrace();
293         }
294 
295     }
296 
297 
298 }

 

以上是关于Java压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

Java itext为pdf 文件添加水印核心功能代码片段

java Ftp上传创建多层文件的代码片段

用于创建单个 .m4s 片段的 Java mp4parser — 无效的 moov 框

java代码实现 导出zip包,无法打开zip压缩包

java中文件如何加密压缩?

java压缩文件解压:调用WinRAR5命令强于自己写代码实现