日期:2014-05-20  浏览次数:20918 次

java 如何将多个文件打包成一个zip ?

我可以得到需要下载的文件路径
String[] path;//这个已知
就是如何将这些文件打包成一个zip供下载?
希望高手们写下详细代码.``

------解决方案--------------------
用zipentry zipoutputstream把文件打包,根据自己的应用修改一下代码代码
Java code

import java.util.List;
import java.util.zip.*;
import java.io.*;
public class ZipCommand {
     private static int ziplevel = 7;
     private File sourceFile = null;
     private File  zipFile = null;
     private ZipOutputStream jos = null;
     private ZipEntry sourEntry = null;
     private String zipfileName = null;
     private String sourceFileName = null;
     private static byte[] buf = new byte[1024];
     
     public static void main(String[] s){
         ZipCommand tz = new ZipCommand();
        //System.out.println( tz.AddtoZip("E:/cis-2000/document/CPoPUserSManual_CPoP_User_s_Manual.doc"));
     }
     
    public String AddtoZip(List sourcefilelist){
        if(sourcefilelist == null || sourcefilelist.size()<1){
            return null;
        }
        sourceFile = new File(sourcefilelist.get(0).toString());
        if(!sourceFile.isFile()){
            return null;
        }else{
            sourceFileName = sourceFile.getName();
            this.setZipfileName(sourceFileName.substring(0,sourceFileName.lastIndexOf("."))+".zip");
            try{
            zipFile = new File(sourceFile.getParent(),this.getZipfileName());

            if(zipFile.exists()){
                int i = 1 ;
                while(true){
                    zipFile = new File(sourceFile.getParent(),this.getZipfileName().substring(0, getZipfileName().lastIndexOf(".zip")) + i + ".zip");
                    if(!zipFile.exists()) break ;
                    i++ ;
                }
            }
            //System.out.println(zipFile.getPath());
             if(zipFile.exists()){
                 zipFile.deleteOnExit();
             }
             zipFile.createNewFile();
             jos = new ZipOutputStream(new FileOutputStream(zipFile));
             jos.setLevel(ziplevel);
             for(int i=0;i<sourcefilelist.size();i++){
            
             Stzip(jos,new File(sourcefilelist.get(i).toString()));
             }
             jos.finish();
            }catch(Exception e){
                return null;
            }
            if(zipFile !=null)
            return zipFile.getPath();
            else{
                return null;
            }
        }
    }
    
     private  void Stzip(ZipOutputStream jos, File file)
     throws IOException, FileNotFoundException
 {
         
         sourEntry= new ZipEntry(file.getName());
         FileInputStream fin = new FileInputStream(file);
         BufferedInputStream in = new BufferedInputStream(fin);
         jos.putNextEntry(sourEntry);
         int len;
         while ((len = in.read(buf)) >= 0) 
             jos.write(buf, 0, len);
         in.close();
         jos.closeEntry();
         
     
 }

     
    public File getSourceFile() {
        return sourceFile;
    }
    public void setSourceFile(File sourceFile) {
        this.sourceFile = sourceFile;
    }

    public String getZipfileName() {
        return zipfileName;
    }

    public void setZipfileName(String zipfileName) {
        this.zipfileName = zipfileName;
    }
    
}

------解决方案--------------------
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
  
public class DirectoryZip {
public static void jar(String inputFileName, String outputFileName) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outputFileName));
out.setEncoding("GBK"); // ###### 这句话是关键,指定输出的编码方式
File f = new File(inputFileName);
jar(out, f, "");