/** * 文件批量打包 * @param zipPath 打包路径 * @param files 批量文件 */ public void zipOut(String zipPath,File[] files){ byte[] buffer = new byte[1024]; try { ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipPath)); for(int i=0;i<files.length;i++) { FileInputStream fis = new FileInputStream(files[i]); out.putNextEntry(new ZipEntry(files[i].getName())); int len; //读入需要下载的文件的内容,打包到zip文件 while((len = fis.read(buffer))>0) { out.write(buffer,0,len); } out.closeEntry(); fis.close(); //删除文件,可以不删 files[i].delete(); } out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("生成zip文件成功"); }
以上为java.util包zip的压缩方式,弊端是不能修改编码。下面介绍apache.tools包zip的压缩方式。
/** * 创建ZIP文件 * @param zipPath 生成的zip文件存在路径(包括文件名) * @param files 写入的文件 */ public static void zipOut(String zipPath,File[] files) { FileOutputStream fos = null; ZipOutputStream zos = null; try { fos = new FileOutputStream(zipPath); zos = new ZipOutputStream(fos); writeZip(files, zos); } catch (FileNotFoundException e) { System.out.println("创建ZIP文件失败"); } finally { try { if (zos != null) { zos.close(); } } catch (IOException e) { System.out.println("创建ZIP文件失败"); } } } /** * 写入内容 * @param files * @param zos */ private static void writeZip(File[] files, ZipOutputStream zos) { for(int i=0;i<files.length;i++) { if(files[i].exists()){ FileInputStream fis=null; DataInputStream dis=null; try { fis=new FileInputStream(files[i]); dis=new DataInputStream(new BufferedInputStream(fis)); ZipEntry ze = new ZipEntry(files[i].getName()); zos.putNextEntry(ze); //添加编码,如果不添加,当文件以中文命名的情况下,会出现乱码 // ZipOutputStream的包一定是apache的ant.jar包。JDK也提供了打压缩包,但是不能设置编码 zos.setEncoding("GBK"); byte [] content=new byte[1024]; int len; while((len=fis.read(content))!=-1){ zos.write(content,0,len); zos.flush(); } } catch (FileNotFoundException e) { System.out.println("创建ZIP文件失败"); } catch (IOException e) { System.out.println("创建ZIP文件失败"); }finally{ try { if(dis!=null){ dis.close(); } }catch(IOException e){ System.out.println("创建ZIP文件失败"); } } } } }