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

解决方案 »

  1.   

    用zipentry zipoutputstream把文件打包,根据自己的应用修改一下代码代码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;
    }

    }
      

  2.   

    整个目录的压缩成一个zip文件其实就是一个不断的压缩的过程!
      

  3.   

    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, "");   
        out.close();   
      }   
      
      private static void jar(ZipOutputStream out, File f, String base) throws Exception {   
        if (f.isDirectory()) {   
          File[] fl = f.listFiles();   
          base = base.length() == 0 ? "" : base + "/";   
          out.putNextEntry(new ZipEntry(base));   
          for (int i = 0; i < fl.length; i++) {   
            jar(out, fl[i], base + fl[i].getName());   
          }   
        } else {   
          out.putNextEntry(new ZipEntry(base));   
          FileInputStream in = new FileInputStream(f);   
          byte[] buffer = new byte[1024];   
          int n = in.read(buffer);   
          while (n != -1) {   
            out.write(buffer, 0, n);   
            n = in.read(buffer);   
          }   
          in.close();   
        }   
      }   
      
      public static void main(String[] args) {   
        try {   
          jar("D:\\temp\\1", "d://mytest.zip");   
        } catch (Exception e) {   
          // TODO Auto-generated catch block   
          e.printStackTrace();   
        }   
      }   
    }  
      

  4.   

    如果可以的话,调用ant任务更简单。嘿嘿。
      

  5.   

    打成jar就不行吗?将源代码一起打进去
      

  6.   

    代码运行需要 ant.jar
    import java.io.*;
    import java.util.Enumeration;import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipFile;
    import org.apache.tools.zip.ZipOutputStream;public class ZipUtil { /**
     * 压缩。
     * 
     * @param src
     *            源文件或者目录
     * @param dest
     *            压缩文件路径
     * @throws IOException
     */
    public static void zip(String src, String dest) throws IOException {
    ZipOutputStream out = null;
    try {
    File outFile = new File(dest);
    out = new ZipOutputStream(outFile);
    File fileOrDirectory = new File(src); if (fileOrDirectory.isFile()) {
    zipFileOrDirectory(out, fileOrDirectory, "");
    } else {
    File[] entries = fileOrDirectory.listFiles();
    for (int i = 0; i < entries.length; i++) {
    // 递归压缩,更新curPaths
    zipFileOrDirectory(out, entries[i], "");
    }
    } } catch (IOException ex) {
    ex.printStackTrace();
    } finally {
    if (out != null) {
    try {
    out.close();
    } catch (IOException ex) {
    }
    }
    }
    } /**
     * 递归压缩文件或目录
     * 
     * @param out
     *            压缩输出流对象
     * @param fileOrDirectory
     *            要压缩的文件或目录对象
     * @param curPath
     *            当前压缩条目的路径,用于指定条目名称的前缀
     * @throws IOException
     */
    private static void zipFileOrDirectory(ZipOutputStream out,
    File fileOrDirectory, String curPath) throws IOException {
    FileInputStream in = null;
    try {
    if (!fileOrDirectory.isDirectory()) {
    // 压缩文件
    byte[] buffer = new byte[4096];
    int bytes_read;
    in = new FileInputStream(fileOrDirectory); ZipEntry entry = new ZipEntry(curPath
    + fileOrDirectory.getName());
    out.putNextEntry(entry); while ((bytes_read = in.read(buffer)) != -1) {
    out.write(buffer, 0, bytes_read);
    }
    out.closeEntry();
    } else {
    // 压缩目录
    File[] entries = fileOrDirectory.listFiles();
    for (int i = 0; i < entries.length; i++) {
    // 递归压缩,更新curPaths
    zipFileOrDirectory(out, entries[i], curPath
    + fileOrDirectory.getName() + "/");
    }
    }
    } catch (IOException ex) {
    ex.printStackTrace();
    throw ex;
    } finally {
    if (in != null) {
    try {
    in.close();
    } catch (IOException ex) {
    }
    }
    }
    } /**
     * 解压缩。
     * 
     * @param zipFileName
     *            源文件
     * @param outputDirectory
     *            解压缩后文件存放的目录
     * @throws IOException
     */
    public static void unzip(String zipFileName, String outputDirectory)
    throws IOException { ZipFile zipFile = null; try {
    zipFile = new ZipFile(zipFileName);
    Enumeration e = zipFile.getEntries(); ZipEntry zipEntry = null; File dest = new File(outputDirectory);
    dest.mkdirs(); while (e.hasMoreElements()) {
    zipEntry = (ZipEntry) e.nextElement(); String entryName = zipEntry.getName(); InputStream in = null;
    FileOutputStream out = null; try {
    if (zipEntry.isDirectory()) {
    String name = zipEntry.getName();
    name = name.substring(0, name.length() - 1); File f = new File(outputDirectory + File.separator
    + name);
    f.mkdirs();
    } else {
    int index = entryName.lastIndexOf("\\");
    if (index != -1) {
    File df = new File(outputDirectory + File.separator
    + entryName.substring(0, index));
    df.mkdirs();
    }
    index = entryName.lastIndexOf("/");
    if (index != -1) {
    File df = new File(outputDirectory + File.separator
    + entryName.substring(0, index));
    df.mkdirs();
    } File f = new File(outputDirectory + File.separator
    + zipEntry.getName());
    // f.createNewFile();
    in = zipFile.getInputStream(zipEntry);
    out = new FileOutputStream(f); int c;
    byte[] by = new byte[1024]; while ((c = in.read(by)) != -1) {
    out.write(by, 0, c);
    }
    out.flush();
    }
    } catch (IOException ex) {
    ex.printStackTrace();
    throw new IOException("解压失败:" + ex.toString());
    } finally {
    if (in != null) {
    try {
    in.close();
    } catch (IOException ex) {
    }
    }
    if (out != null) {
    try {
    out.close();
    } catch (IOException ex) {
    }
    }
    }
    } } catch (IOException ex) {
    ex.printStackTrace();
    throw new IOException("解压失败:" + ex.toString());
    } finally {
    if (zipFile != null) {
    try {
    zipFile.close();
    } catch (IOException ex) {
    }
    }
    } } public static void main(String[] args) {
    try {
     ZipUtil.zip("C:\\0115080120081024","d:\\0115080120081027.zip");
    //ZipUtil.unzip("D:\\a\\010108012008-8-25.zip", "d:\\a\\tmp");
    } catch (Exception e) {
    e.printStackTrace();
    } }}
      

  7.   

    不管如何做,如果用JDK 的zip压缩,中文问题早晚会碰到,如果碰到了,到apache上面下在他的zip包用就可以了,这个不是单独的一个zip,是和别的打包在一起的,哪一个忘了
    找到以后删除多余的,最终也就70kb左右,支持zip,tar,gzip
      

  8.   

    貌似JDK自带的那个ZIP有些问题,网上都建议用APACHE的