文件打包(.zip)并返回打压缩包存放路径

Posted 。低调ヽ继续

tags:

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

1.由于公司需要将一个或多个视频进行打包,格式如下图:

2.创建zipUtil工具包:

  1 package com.seegot.util;
  2 
  3 import java.io.BufferedOutputStream;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.FileOutputStream;
  7 import java.io.InputStream;
  8 import java.util.zip.ZipEntry;
  9 import java.util.zip.ZipOutputStream;
 10 
 11 import org.apache.tools.ant.Project;
 12 import org.apache.tools.ant.taskdefs.Expand;
 13 
 14 /**
 15  * 解压缩zip包处理类
 16  * 
 17  */
 18 
 19 public class ZipUtil {
 20     
 21     private static final String ENCODE = "UTF-8";
 22     
 23     public static void main(String[] args) throws Exception {
 24         
 25         /*ZipUtil.toZip("D:\\\\downAndLoad\\\\upload\\\\03674540cea94873a1e6b90a8df9f87f", 
 26         "D:\\\\downAndLoad\\\\zip\\\\temp","2222.zip");*/
 27         ZipUtil.unZip("E:\\\\unZip1.zip", "E:\\\\");
 28     }
 29     
 30     /**
 31     * @desc 将源文件/文件夹生成指定格式的压缩文件,格式zip
 32     * @param resourePath 源文件/文件夹
 33     * @param targetPath  目的压缩文件保存路径
 34     *                        压缩到的位置,如果为null或空字符串则默认解压缩到跟源文件夹或者文件所在的同一目录
 35     * @return void
 36     *               
 37     * @throws Exception
 38     */
 39     public static String toZip(String resourcesPath, String targetPath, String targetName)
 40             throws Exception {
 41         File resourcesFile = new File(resourcesPath); // 源文件
 42         String directoryPath = "";
 43         
 44         // 如果为null或空字符串则默认为目标文件夹名
 45         if (targetName == null || targetName.trim().length() == 0)
 46             targetName = resourcesFile.getName() + ".zip"; // 目的压缩文件名
 47         // 如果为null或空字符串则默认解压缩到跟源文件夹或者文件所在的同一目录
 48 //        if (StringUtil.isEmpty(targetPath))
 49         if (targetPath == null || targetPath.trim().length() == 0)
 50             directoryPath = resourcesPath.substring(0, resourcesPath
 51                     .replaceAll("\\\\*", "/").lastIndexOf("\\\\"));
 52         else
 53             directoryPath = targetPath;
 54         File targetFile = new File(directoryPath); // 目的
 55         // 如果目的路径不存在,则新建
 56         if (!targetFile.exists()) {
 57             targetFile.mkdirs();
 58         } 
 59         
 60         FileOutputStream outputStream = new FileOutputStream(targetPath
 61                 + File.separator + targetName);
 62         ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
 63                 outputStream));
 64         createCompressedFile(out, resourcesFile, "");
 65         out.close();
 66         return targetPath+"\\\\"+targetName;
 67     }
 68     
 69     /**
 70     * @desc 生成压缩文件。 如果是文件夹,则使用递归,进行文件遍历、压缩
 71     *                     如果是文件,直接压缩
 72     * @param out  输出流
 73     * @param file  目标文件
 74     * @return void
 75     * @throws Exception
 76     */
 77     public static void createCompressedFile(ZipOutputStream out, File file,
 78             String dir) throws Exception {
 79         InputStream is = null;
 80         try{
 81             // 如果当前的是文件夹,则进行进一步处理
 82             if (file.isDirectory()) {
 83                 // 得到文件列表信息
 84                 File[] files = file.listFiles();
 85                 // 将文件夹添加到下一级打包目录
 86                 out.putNextEntry(new ZipEntry(dir + "/"));
 87                 dir = dir.length() == 0 ? "" : dir + "/";
 88                 // 循环将文件夹中的文件打包
 89                 for (int i = 0; i < files.length; i++) {
 90                     createCompressedFile(out, files[i], dir + files[i].getName()); // 递归处理
 91                 }
 92             } else { // 当前的是文件,打包处理
 93                 // 文件输入流
 94                 is = new FileInputStream(file);
 95                 out.putNextEntry(new ZipEntry(dir));
 96                 // 进行写操作
 97                 int len = 0;
 98                 byte[] buffer = new byte[1024];
 99                 while ((len = is.read(buffer)) > 0) {
100                     out.write(buffer, 0, len);
101                 }
102                 // 关闭输入流
103                 is.close();
104             }
105         }catch (Exception e) {
106             is.close();
107             out.close();
108         }
109     }
110     
111     
112     /****
113      * 解压
114      * 
115      * @param zipPath
116      *            zip文件路径
117      * @param destinationPath
118      *            解压的目的地点
119      * @param ecode
120      *            文件名的编码字符集
121      */
122     public static void unZip(String zipPath, String destinationPath) {
123         File zipFile = new File(zipPath);
124         if (!zipFile.exists())
125             throw new RuntimeException("zip file " + zipPath
126                     + " does not exist.");
127         Project proj = new Project();
128         Expand expand = new Expand();
129         expand.setProject(proj);
130         expand.setTaskType("unzip");
131         expand.setTaskName("unzip");
132         expand.setSrc(zipFile);
133         expand.setDest(new File(destinationPath));
134         expand.setEncoding(ENCODE);
135         expand.execute();
136         System.out.println("unzip done!!!");
137     }
138     
139 //    /**
140 //     * 解压缩zip包 
141 //     * 
142 //     * @param zipFilePath zip文件路径
143 //     * @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下 
144 //     * @throws IOException
145 //     * 
146 //     */
147 //    public static void unZip(String zipFilePath, String targetPath)
148 //            throws IOException {
149 //        ZipFile zipFile = new ZipFile(zipFilePath);
150 //        String directoryPath = "";
151 //        // 如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下
152 //        // if (StringUtil.isEmpty(targetPath))
153 //        if (targetPath == null || targetPath.trim().length() == 0)
154 //            directoryPath = zipFilePath.substring(0,
155 //                    zipFilePath.lastIndexOf("."));
156 //        else
157 //            directoryPath = targetPath;
158 //
159 //        Enumeration<ZipEntry> entryEnum = zipFile.getEntries();
160 //        OutputStream os = null;
161 //        InputStream is = null;
162 //        try{
163 //            if (entryEnum != null) {
164 //                ZipEntry zipEntry = null;
165 //                while (entryEnum.hasMoreElements()) {
166 //                    zipEntry = (ZipEntry) entryEnum.nextElement();
167 //                    // 如果为目录
168 //                    if (zipEntry.isDirectory()) {
169 //                        System.out.println("文件夹路径--------------" + directoryPath
170 //                                + File.separator + zipEntry.getName());
171 //                        File target = new File(directoryPath + File.separator
172 //                                + zipEntry.getName());
173 //                        target.mkdirs();
174 //                        continue;
175 //                    }
176 //                    if (zipEntry.getSize() != -1) {
177 //                        // 文件
178 //                        File targetFile = new File(directoryPath + File.separator
179 //                                + zipEntry.getName());
180 //                        // 如果目的文件夹的父目录为空,则创建
181 //                        if (!targetFile.getParentFile().exists()) {
182 //                            targetFile.getParentFile().mkdirs();
183 //                            targetFile = new File(targetFile.getAbsolutePath());
184 //                        }
185 //                        os = new BufferedOutputStream(
186 //                                new FileOutputStream(targetFile));
187 //                        is = zipFile.getInputStream(zipEntry);
188 //                        byte[] buffer = new byte[1024];
189 //                        int len = 0;
190 //                        while ((len = is.read(buffer, 0, 1024)) >= 0) {
191 //                            os.write(buffer, 0, len);
192 //                        }
193 //                    }
194 //                }
195 //            }
196 //        }finally{
197 //            if(os!=null)
198 //                os.close();
199 //            if(is!=null)
200 //                is.close();
201 //            zipFile.close();
202 //        }
203 //    }
204 
205 }
View Code

3.编写自己的方法

 1 String fileUrl = request.getParameter("fileUrl");
 2         String[] fileUrls = fileUrl.split(",");
 3         String filename = request.getParameter("filename"); // 编号- 
 4         // code = new String(code.getBytes("iso-8859-1"), "UTF-8");
 5         String timeLength = request.getParameter("timeLength");
 6         String[] timeLengths = timeLength.split(",");
 7         String tempZipPath = PropertyUtil.getProperty("tempZipPath"); // 临时路径
 8         String scormTempletPath = PropertyUtil.getProperty("scormTemplet"); // scorm样板路径  2017-06-30
 9         String mp4path = PropertyUtil.getProperty("mp4path"); // scorm样板路径
10         String uuid = UUID.randomUUID().toString().replace("-", "");
11         String dbPath = tempZipPath   + uuid + "\\\\" + filename + "\\\\"; 
12         // 判断该路径是否存在,如果不存在这创建一个这样的路径
13         if (!new File(dbPath).exists())
14             new File(dbPath).mkdirs();
15         // 首先复制文件夹到临时文件夹下面
16         copyDir(scormTempletPath, dbPath);
17         // 将视频文件复制到临时路径下
18         for (int i = 0; i < fileUrls.length; i++) {
19             String path = mp4path + fileUrls[i];
20             System.out.println("视频文件path:" + path + "------------");
21             copyFile(path, dbPath);// 从path 复制到dbpath
22         }
23         // 创建一个 videoList.txt
24         creatTxt(dbPath, fileUrls, timeLengths);
25         // 创建一个videoList.xml
26         creatXML(dbPath, fileUrls, timeLengths);
27         // 写入完毕后打包
28         SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyyMMssHHmmSSS");
29         String timeformat = simpleDateFormat.format(new Date()); 
30         String fileZipUrl = tempZipPath+timeformat+"\\\\";
31         ZipUtil.toZip(dbPath, fileZipUrl, filename + ".zip");
32         return fileZipUrl;
View Code

 4.copy文件方法

 1     /**
 2      * @desc 复制文件夹
 3      * @author zp
 4      * @date 2017-2-28
 5      * @param oldPath
 6      * @param newPath
 7      * @throws IOException
 8      */
 9     public static void copyDir(String oldPath, String newPath)
10             throws IOException {
11         try {
12             (new File(newPath)).mkdirs(); // 如果文件夹不存在 则建立新文件夹
13             File a = new File(oldPath);
14             String[] file = a.list();
15             File temp = null;
16             for (int i = 0; i < file.length; i++) {
17                 if (oldPath.endsWith(File.separator)) {
18                     temp = new File(oldPath + file[i]);
19                 } else {
20                     temp = new File(oldPath + File.separator + file[i]);
21                 }
22 
23                 if (temp.isFile()) {
24                     FileInputStream input = new FileInputStream(temp);
25                     FileOutputStream output = new FileOutputStream(newPath
26                             + "/" + (temp.getName()).toString());
27                     byte[] b = new byte[1024 * 5];
28                     int len;
29                     while ((len = input.read(b)) != -1) {
30                         output.write(b, 0, len);
31                     }
32                     output.flush();
33                     output.close();
34                     input.close();
35                 }
36                 if (temp.isDirectory()) {// 如果是子文件夹
37                     copyDir(oldPath + "/" + file[i], newPath + "/" + file[i]);
38                 }
39             }
40         } catch (Exception e) {
41             System.out.println("复制整个文件夹内容操作出错");
42             e.printStackTrace();
43 
44         }
45     }
View Code

5.创建txt  xml 看前两个随笔。

以上是关于文件打包(.zip)并返回打压缩包存放路径的主要内容,如果未能解决你的问题,请参考以下文章

zip压缩工具 tar打包打包并压缩

zip压缩工具tar打包打包并压缩

四周第五次课 6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

linux笔记-020-zip压缩工具,tar打包和打包并压缩

zip压缩工具tar打包和打包压缩

Linux压缩和解压包常用命令:gzip tar zip/unzip命令使用示例