2012年5月31日星期四

Java 导出zip文件。

Java 导出zip文件。

前些日子,需要使用Java来实现导出zip文件。这两天刚好没事儿,简单的整理了一下,共享给大家,也以备将来自己忘记。

当然,Java web项目一般是遵循这mvc模式,那就简单的从action上入手介绍:

action中主要是输出到客户端。

其中的方法大致如下:

 1 public String export 2         try { 3             response.setContentType("application/zip;charset=UTF-8"); 4             response.setHeader("Cache-Control", "no-cache"); 5             Calendar calendar = iExport 6             StringBuffer stringBuffer = new StringBuffer(); 7             if(calendar != null){ 8                 stringBuffer.append(calendar.get(Calendar.YEAR)); 9                 stringBuffer.append("-");10                 stringBuffer.append((calendar.get(Calendar.MONTH)+1));11                 stringBuffer.append("-");12                 stringBuffer.append(calendar.get(Calendar.DATE));13                 stringBuffer.append("_");14                 stringBuffer.append(Producer.generateIdOfTen());15                 stringBuffer.append(".zip");16                 fileName =  stringBuffer.toString();17             }else {18                 stringBuffer.append("export);19                 stringBuffer.append(Producer.generateIdOfTen());20                 stringBuffer.append(".zip");21             }22             fileName = new String(fileName.getBytes(), "ISO8859-1");23             response.addHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");24             ServletOutputStream out = response.getOutputStream();25             if(archiveNumbers!=null&&!archiveNumbers.equals("")){26                 iExport);27             }else{28                 out.flush();29                 out.close();30                 return null;31             }32             out.write(FileUtil.getBytesFromFile(new File(""+session.get("tempFolder")+File.separator+"fileName)));33             out.flush();34             out.close();35         } catch (Exception e) {36             e.printStackTrace();37             session.put("exceptionInfoClass", e);38             return "exceptionOperateAction";39         }40         return null;41     }

然后是service层生成zip文件到tempFolder临时文件夹下(核心的技术代码如下):

byte[] buffer = new byte[1024];ZipOutputStream out = new ZipOutputStream(new FileOutputStream(tempFolder+File.separator+fileName));//需要打包的zipfiles数组List<File> files = new ArrayList<File>();//通过相应的业务来封装自己的list。FileInputStream fis = null;            for (File eachFile : allFiles) {                fis = new FileInputStream(eachFile);                out.putNextEntry(new ZipEntry(eachFile.getName()));                int len;                while ((len = fis.read(buffer)) > 0) {                    out.write(buffer, 0, len);                }                out.closeEntry();                fis.close();            }            out.close();


嗯,生成文件,大致如上了。嗯,还存在一个小问题就是,主要是在服务器端会生成相应的zip包,占用硬盘。


TAG: