首页 > 编程知识 正文

java压缩多个文件,java判断文件是否是压缩文件

时间:2023-05-06 01:43:15 阅读:282646 作者:1487

此代码将多个不同目录下的文件打包成一个压缩包,如需要递归打包一个目录,点我跳转

 ---------------------------------------------------------------------------------------------------------------------------

 

java打包有两种方式,一种是使用JDK自带的类(java.util.zip.ZipOutputStream;java.util.zip.ZipEntry)。

还有一种是使用apache提供的类(org.apache.tools.zip.ZipOutputStream;org.apache.tools.zip.ZipEntry)。

 

常见错误解决办法:

 

压缩包内的文件乱码解决办法:JDK自带的压缩类不提供设置编码的方法,这样会导致压缩包里面的文件名乱码,所以在使用的时候要注意引用apache提供的包调用 setEncoding("GBK")  方法。

 

压缩包的某些文件损坏解决办法:一定要及时的清空和关闭 (zos.flush();zos.close();),否则会导致压缩包的某些文件损坏。

 

丢失中文文件名解决办法: fileName = new String(fileName.getBytes(),"ISO-8859-1"); // 中文转码

 

还有一种情况,就是下载下来的压缩包内缺少文件,明明打包了3个文件,下载下来却只有2个或者1个,那是因为常用的压缩软件WinRAR会自动过滤掉0kb 的文件,可以使用360压缩打开,即可看到被WinRAR过滤掉的0kb文件。


完整代码: package com.atwp.dowonzip;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DowonZipServlet extends HttpServlet {private static final long serialVersionUID = -5575023666592266887L;public DowonZipServlet() {super();}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String fileName = "文件打包.zip";fileName = new String(fileName.getBytes(), "ISO-8859-1"); // 必须转码,否则会丢失中文文件名。response.setContentType("APPLICATION/OCTET-STREAM");response.setHeader("Content-Disposition", "attachment; filename=" + fileName); // 设置文件名ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); /* 把需要打包的文件存入数组 */File[] files = new File[3];files[0] = new File("F:/OwO/testFiles/imgs/1.jpg");files[1] = new File("F:/OwO/testFiles/imgs/2.jpg");files[2] = new File("F:/OwO/testFiles/imgs/3.jpg");try {byte[] zipFile = zipFile(files, "", zos);response.getOutputStream().write(zipFile); // 输出到页面} catch (Exception e) {e.printStackTrace();}finally { // 必须释放以及关闭,否则可能会出现压缩的文件出现损坏。zos.flush();zos.close();}}private byte[] zipFile(File[] subs, String baseName, ZipOutputStream zos) throws IOException {try {byte[] buffer = null;for (int i = 0; i < subs.length; i++) {File f = subs[i];zos.putNextEntry(new ZipEntry(baseName + f.getName()));FileInputStream fis = new FileInputStream(f);buffer = new byte[1024];int r = 0;while ((r = fis.read(buffer)) != -1) zos.write(buffer, 0, r);fis.close();}return buffer;} catch (Exception e) {e.printStackTrace();return null;}finally { // 必须释放和关闭,否则可能会出现压缩的文件出现损坏。zos.flush();zos.close();}}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。