FileOutputStream out = new FileOutputStream("F:\\fuyou.zip");
 ZipOutputStream zip = new ZipOutputStream(out);
 ZipEntry ze = new ZipEntry("F:\\api");
 zip.putNextEntry(ze);
 zip.closeEntry();
 zip.close();
我想在F盘下新建一个fuyou.zip压缩文件,里面有F盘下的api文件夹,但上面的运行结果只有一个api条目,还没文件夹或内容

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【fuyou001】截止到2008-06-26 16:24:33的历史汇总数据(不包括此帖):
    发帖数:151                发帖分:4840               
    结贴数:151                结贴分:4840               
    未结数:0                  未结分:0                  
    结贴率:100.00%            结分率:100.00%            
    敬礼!
      

  2.   

    恩,没错,你需要做个递归来把文件夹中的文件也全部打进来
    public void zip(String zipFileName, String inputFile) throws Exception {
    zip(zipFileName, new File(inputFile));
    } public void zip(String zipFileName, File inputFile) throws Exception {
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
    zipFileName));
    zip(out, inputFile, "");
    System.out.println("zip done");
    out.close();
    } public void zip(ZipOutputStream out, File f, String base) throws Exception {
    System.out.println("Zipping  " + f.getName());
    if (f.isDirectory()) {
    File[] fl = f.listFiles();
    out.putNextEntry(new ZipEntry(base + "/"));
    base = base.length() == 0 ? "" : base + "/";
    for (int i = 0; i < fl.length; i++) {
    zip(out, fl[i], base + fl[i].getName());
    }
    } else {
    out.putNextEntry(new ZipEntry(base));
    FileInputStream in = new FileInputStream(f);
    int b;
    while ((b = in.read()) != -1)
    out.write(b);
    in.close();
    }
    }
      

  3.   

    这里的参数String base表示什么意思
      

  4.   

    package book.io;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipOutputStream;/**
     * 用ZIP压缩和解压缩文件或目录
     */
    public class CompressUtil { /**
     * 压缩文件或者目录
     * @param baseDirName 压缩的根目录
     * @param fileName 根目录下待压缩的文件或文件夹名,
     * 星号*表示压缩根目录下的全部文件。
     * @param targetFileName 目标ZIP文件
     */
    public static void zipFile(String baseDirName, String fileName, 
    String targetFileName){
    //检测根目录是否存在
    if (baseDirName == null){
    System.out.println("压缩失败,根目录不存在:" + baseDirName);
    return;
    }
    File baseDir = new File(baseDirName);
    if (!baseDir.exists() || (!baseDir.isDirectory())){
    System.out.println("压缩失败,根目录不存在:" + baseDirName);
    return;
    }
    String baseDirPath = baseDir.getAbsolutePath();
    //目标文件
    File targetFile = new File(targetFileName);
    try{
    //创建一个zip输出流来压缩数据并写入到zip文件 
    ZipOutputStream out =new ZipOutputStream(
    new FileOutputStream(targetFile)); 
    if (fileName.equals("*")){
    //将baseDir目录下的所有文件压缩到ZIP
    CompressUtil.dirToZip(baseDirPath, baseDir, out);
    } else {
    File file = new File(baseDir, fileName);
    if (file.isFile()){
    CompressUtil.fileToZip(baseDirPath, file, out);
    } else {
    CompressUtil.dirToZip(baseDirPath, file, out);
    }
    }
    out.close(); 
    System.out.println("压缩文件成功,目标文件名:" + targetFileName);
    } catch (IOException e){
    System.out.println("压缩失败:" + e);
    e.printStackTrace();
    }
    } /**
     * 解压缩ZIP文件,将ZIP文件里的内容解压到targetDIR目录下
     * @param zipName 待解压缩的ZIP文件名
     * @param targetBaseDirName 目标目录
     */
    public static void upzipFile(String zipFileName, String targetBaseDirName){
    if (!targetBaseDirName.endsWith(File.separator)){
    targetBaseDirName += File.separator;
    }
            try {
             //根据ZIP文件创建ZipFile对象
             ZipFile zipFile = new ZipFile(zipFileName);
                ZipEntry entry = null;
                String entryName = null;
                String targetFileName = null;
                byte[] buffer = new byte[4096];
                int bytes_read; 
                //获取ZIP文件里所有的entry
                Enumeration entrys = zipFile.entries();
                //遍历所有entry
                while (entrys.hasMoreElements()) {
                 entry = (ZipEntry)entrys.nextElement();
                 //获得entry的名字
                 entryName =  entry.getName();
                 targetFileName = targetBaseDirName + entryName;
                 if (entry.isDirectory()){
                 //  如果entry是一个目录,则创建目录
                 new File(targetFileName).mkdirs();
                 continue;
                 } else {
                 // 如果entry是一个文件,则创建父目录
                 new File(targetFileName).getParentFile().mkdirs();
                 }             //否则创建文件
                 File targetFile = new File(targetFileName);
                 System.out.println("创建文件:" + targetFile.getAbsolutePath());
                 //打开文件输出流
                 FileOutputStream os = new FileOutputStream(targetFile);
                 //从ZipFile对象中打开entry的输入流
                 InputStream  is = zipFile.getInputStream(entry);
                 while ((bytes_read = is.read(buffer)) != -1){
                 os.write(buffer, 0, bytes_read);
                 }
                 //关闭流
                 os.close( );
                 is.close( );
                }
                System.out.println("解压缩文件成功!");
            } catch (IOException err) {
                System.err.println("解压缩文件失败: " + err);
            }
    }

    /**
     * 将目录压缩到ZIP输出流。
     */
    private static void dirToZip(String baseDirPath, File dir, 
    ZipOutputStream out){
    if (dir.isDirectory()){
    //列出dir目录下所有文件
    File[] files  = dir.listFiles();
    // 如果是空文件夹
    if (files.length == 0){
    ZipEntry entry = new ZipEntry(getEntryName(baseDirPath, dir));  
    // 存储目录信息
    try {
    out.putNextEntry(entry);
    out.closeEntry();
    } catch (IOException e) {
    e.printStackTrace();
    }
    return;
    }
    for (int i=0; i<files.length; i++){
    if (files[i].isFile()){
    //如果是文件,调用fileToZip方法
    CompressUtil.fileToZip(baseDirPath, files[i], out);
    } else {
    //如果是目录,递归调用
    CompressUtil.dirToZip(baseDirPath, files[i], out);
    }
    }
    }
    }
    /**
     * 将文件压缩到ZIP输出流
     */
    private static void fileToZip(String baseDirPath, File file, 
    ZipOutputStream out){
    FileInputStream in = null;
    ZipEntry entry = null;
    // 创建复制缓冲区
    byte[] buffer = new byte[4096];    
    int bytes_read; 
    if (file.isFile()){
    try {
    // 创建一个文件输入流
    in = new FileInputStream(file);  
    // 做一个ZipEntry
    entry = new ZipEntry(getEntryName(baseDirPath, file));  
    // 存储项信息到压缩文件
    out.putNextEntry(entry);
    // 复制字节到压缩文件
    while((bytes_read = in.read(buffer)) != -1){  
    out.write(buffer, 0, bytes_read); 
    }
    out.closeEntry();
    in.close(); 
    System.out.println("添加文件" 
    + file.getAbsolutePath() + "被到ZIP文件中!");
    } catch (IOException e){
    e.printStackTrace();
    }
    }
    }
    /**
     * 获取待压缩文件在ZIP文件中entry的名字。即相对于跟目录的相对路径名
     * @param baseDirPath
     * @param file
     * @return
     */
    private static String getEntryName(String baseDirPath, File file){
    if (!baseDirPath.endsWith(File.separator)){
    baseDirPath += File.separator;
    }
    String filePath = file.getAbsolutePath();
    // 对于目录,必须在entry名字后面加上"/",表示它将以目录项存储。
    if (file.isDirectory()){
    filePath += "/";
    }
    int index = filePath.indexOf(baseDirPath);
    return filePath.substring(index + baseDirPath.length());
    }

    public static void main(String[] args) {
    //压缩C盘下的temp目录,压缩后的文件是C:/temp.zip
    String baseDirName = "C:/";
    String fileName = "temp/";
    String zipFileName = "C:/temp.zip";
    CompressUtil.zipFile(baseDirName, fileName, zipFileName);
    //将刚创建的ZIP文件解压缩到D盘的temp目录下
    System.out.println();
    fileName = "D:/temp";
    CompressUtil.upzipFile(zipFileName, fileName);
    }
    }
      

  5.   

    用2楼的方法现写了个:package com.fuyou;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;public class Test {
    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub FileOutputStream out = new FileOutputStream("F:\\fuyou002.zip");
     ZipOutputStream zip = new ZipOutputStream(out);  
     File inputFile = new File("F:\\fuyou");

     Test.zip(zip, inputFile, "");
     out.close();

    }
     public static void zip(ZipOutputStream out, File f, String base) throws Exception {
            System.out.println("Zipping " + f.getName());
            if (f.isDirectory()) {
                File[] fl = f.listFiles();
                out.putNextEntry(new ZipEntry(base + "/"));
                base = base.length() == 0 ? "" : base + "/";
                for (int i = 0; i < fl.length; i++) {
                    zip(out, fl[i], base + fl[i].getName());
                }
            } else {
                out.putNextEntry(new ZipEntry(base));
                FileInputStream in = new FileInputStream(f);
                int b;
                while ((b = in.read()) != -1)
                    out.write(b);
                in.close();
            }
        }

    }但压缩完成后,打开压缩文件夹,出现了这个错误:!   F:\fuyou002.zip: 不可预料的压缩文件末端
      

  6.   


    这个是没有文件夹的.public static void main(String[] args) {
            // TODO Auto-generated method stub
         try{
        FileOutputStream out = new FileOutputStream("c:\\fuyou002.zip");
         ZipOutputStream zip = new ZipOutputStream(out);  
         File inputFile = new File("c:\\aa");
        File[]list = inputFile.listFiles();
        for(int i=0;i<list.length;i++)
        {
          ZipEntry zi = new ZipEntry(list[i].getName());
          zip.putNextEntry(new ZipEntry(zi));
          FileInputStream in = new FileInputStream(list[i]);
             byte tt[]=new byte[512];
             int b;
             while ((b = in.read(tt)) != -1)
              zip.write(tt,0,b);
             in.close();
             zip.closeEntry();
        }
         //Test1.zip(zip, inputFile, "");
        zip.close();
         out.close();
         }catch (Exception e) {
    // TODO: handle exception\
         e.printStackTrace();
    }
        }
      

  7.   

    按照你的改的,带路径的,只改了递归的方法public static void zip(ZipOutputStream out, File f, String base) throws Exception {
                System.out.println("Zipping " + f.getName());
                if (f.isDirectory()) {
                    File[] fl = f.listFiles();
                    out.putNextEntry(new ZipEntry(base + "/"));
                    base = base.length() == 0 ? "" : base + "/";
                    for (int i = 0; i < fl.length; i++) {
                        zip(out, fl[i], base + fl[i].getName());
                    }
                    out.closeEntry();
                } else {
                    out.putNextEntry(new ZipEntry(base));
                    FileInputStream in = new FileInputStream(f);
                    byte tt[]=new byte[512];
                    int b;
                    while ((b = in.read(tt)) != -1)
                        out.write(tt,0,b);
                    in.close();
                    out.closeEntry();
                }
            }