关于文件的压缩ZipOutputStream

巴西内马尔 发布于 2016/08/30 16:46
阅读 421
收藏 0
/*
 *  压缩
 */
public class Compression {
 
 //要压缩文件的路径
 private String srcPath;
 
 //压缩后存放的路径
 private String dirPath;
 
 
 public Compression(String srcPath, String dirPath) {
  // TODO Auto-generated constructor stub
  this.srcPath = srcPath;
  this.dirPath = dirPath;
 }
 
 /*
  *  压缩程序
  */
 public void compressionProgram() {
  ZipOutputStream zipOutputStream = null;
  
  File file = null;
  
  try {
   file = new File(srcPath);
   
   zipOutputStream = new ZipOutputStream(new FileOutputStream(dirPath));
   
   ZipEntry zipEntryFile = new ZipEntry(file.getName());
   
   zipOutputStream.putNextEntry(zipEntryFile);
   
   if(file.isDirectory()) {//文件夹
    compressionFolder(file, zipOutputStream);
   } else {//文件
    compressionFile(file, zipOutputStream);
   }
   
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   try {
    if(zipOutputStream != null) {
     zipOutputStream.close();
    }
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 
 /*
  *  压缩文件
  *  参数: 当前访问的文件file,  压缩流zipCompression
  */
 private void compressionFile(File file, ZipOutputStream zipOutputStream){
  
  FileInputStream fileInputStream = null;
  
  try {
   fileInputStream = new FileInputStream(file);
   
   byte[] byteStr = new byte[1024 * 1024]; // 每次读取1M
   
   int strLength = fileInputStream.read(byteStr);
   
   while(strLength != -1) {
    zipOutputStream.write(byteStr, 0, strLength);
    
    strLength = fileInputStream.read(byteStr);
   }
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   new Throwable("文件不存在!");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   try {
    if(fileInputStream != null) {
     fileInputStream.close();
    }
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

 /*
  *  压缩文件夹
  */
 private void compressionFolder(File file, ZipOutputStream zipOutputStream) throws FileNotFoundException {
  
  FileInputStream fileInputStream = null;
  
  File[] files = null;
  
  try {
   
   files = file.listFiles(); //得到该文件夹下的所有文件
   
   for (File filesFile : files) {
    if(filesFile.isDirectory()) {
     zipOutputStream.putNextEntry(new ZipEntry(filesFile.getName()));
     compressionFolder(file, zipOutputStream);
    } else {
     compressionFile(file, zipOutputStream);
    }
   }
   
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}



压缩文件夹不成功。在压缩文件夹中这句zipOutputStream.putNextEntry(new ZipEntry(filesFile.getName()));
有问题

加载中
0
如比如比
如比如比
        if (filesFile.isDirectory()) {  
            zipOutputStream.putNextEntry(new ZipEntry(filesFile.getName() + "/"));  
            File[] files = filesFile.listFiles();  
            for (File file : files) {  
                compressionFolder(file, zipOutputStream);  
            }  
        } 
巴西内马尔
巴西内马尔
我试了一下,不行。我想在这个函数中做递归。
0
如比如比
如比如比
public class Compression {


  // 要压缩文件的路径
  private String srcPath;


  // 压缩后存放的路径
  private String dirPath;


  public Compression(String srcPath, String dirPath) {
    this.srcPath = srcPath;
    this.dirPath = dirPath;
  }


  /**
   * 压缩程序
   */
  public void compressionProgram() {
    ZipOutputStream zipOutputStream = null;
    File file = null;


    try {
      file = new File(srcPath);
      zipOutputStream = new ZipOutputStream(new FileOutputStream(dirPath));


      if(file.isDirectory()) {//文件夹
        compressionFolder(file, zipOutputStream, "");
      } else {//文件
        zipOutputStream.putNextEntry(new ZipEntry(""));
        compressionFile(file, zipOutputStream, "");
      }


    } catch (FileNotFoundException  e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if(zipOutputStream != null) {
         zipOutputStream.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    } // try
 }


  /**
   *  压缩文件
   *  参数: 当前访问的文件file,  压缩流zipCompression
   */
  private void compressionFile(File file, ZipOutputStream zipOutputStream, String dir) {
    FileInputStream fileInputStream = null;
    try {


      zipOutputStream.putNextEntry(new ZipEntry(dir + file.getName()));


      fileInputStream = new FileInputStream(file);
      byte[] byteStr = new byte[1024 * 1024]; // 每次读取1M
      int strLength = -1;


      while((strLength = fileInputStream.read(byteStr) ) > 0) {
        zipOutputStream.write(byteStr, 0, strLength);
      }


    } catch (FileNotFoundException e) {
      new Throwable("文件不存在!");
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if(fileInputStream != null) {
          fileInputStream.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    } // try
 }


  /**
   *  压缩文件夹
   */
  private void compressionFolder(File file, ZipOutputStream zipOutputStream, String dir) throws FileNotFoundException {
    String path = dir + file.getName() + "/";
    try {
      zipOutputStream.putNextEntry(new ZipEntry(path));


      File[] files = file.listFiles(); //得到该文件夹下的所有文件
      for (File filesFile : files) {


        if(filesFile.isDirectory()) {
          compressionFolder(filesFile, zipOutputStream, path);
        } else {
          compressionFile(filesFile, zipOutputStream, path);
        }


      } // for


    } catch (IOException e) {
       e.printStackTrace();
    }
  }
}

0
巴西内马尔
巴西内马尔

引用来自“离未罔两”的评论

public class Compression {


  // 要压缩文件的路径
  private String srcPath;


  // 压缩后存放的路径
  private String dirPath;


  public Compression(String srcPath, String dirPath) {
    this.srcPath = srcPath;
    this.dirPath = dirPath;
  }


  /**
   * 压缩程序
   */
  public void compressionProgram() {
    ZipOutputStream zipOutputStream = null;
    File file = null;


    try {
      file = new File(srcPath);
      zipOutputStream = new ZipOutputStream(new FileOutputStream(dirPath));


      if(file.isDirectory()) {//文件夹
        compressionFolder(file, zipOutputStream, "");
      } else {//文件
        zipOutputStream.putNextEntry(new ZipEntry(""));
        compressionFile(file, zipOutputStream, "");
      }


    } catch (FileNotFoundException  e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if(zipOutputStream != null) {
         zipOutputStream.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    } // try
 }


  /**
   *  压缩文件
   *  参数: 当前访问的文件file,  压缩流zipCompression
   */
  private void compressionFile(File file, ZipOutputStream zipOutputStream, String dir) {
    FileInputStream fileInputStream = null;
    try {


      zipOutputStream.putNextEntry(new ZipEntry(dir + file.getName()));


      fileInputStream = new FileInputStream(file);
      byte[] byteStr = new byte[1024 * 1024]; // 每次读取1M
      int strLength = -1;


      while((strLength = fileInputStream.read(byteStr) ) > 0) {
        zipOutputStream.write(byteStr, 0, strLength);
      }


    } catch (FileNotFoundException e) {
      new Throwable("文件不存在!");
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        if(fileInputStream != null) {
          fileInputStream.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    } // try
 }


  /**
   *  压缩文件夹
   */
  private void compressionFolder(File file, ZipOutputStream zipOutputStream, String dir) throws FileNotFoundException {
    String path = dir + file.getName() + "/";
    try {
      zipOutputStream.putNextEntry(new ZipEntry(path));


      File[] files = file.listFiles(); //得到该文件夹下的所有文件
      for (File filesFile : files) {


        if(filesFile.isDirectory()) {
          compressionFolder(filesFile, zipOutputStream, path);
        } else {
          compressionFile(filesFile, zipOutputStream, path);
        }


      } // for


    } catch (IOException e) {
       e.printStackTrace();
    }
  }
}

   晚上重新改了一下,加入路径,但不是很理解ZipEntry这个类。只有在绝对路径下可以压缩所有文件。准备早上再思考一下。看见了这篇答案,试了一下,可以压缩而且不是在绝对路径下,很好的解决了这个问题。谢谢了!!!我在研究研究代码。
返回顶部
顶部