前些天做了一个信息基础考试系统,其中有一步要求客户端从服务器端抽取试题,下载本地,然后用程序解压缩,解压缩完成后,删除zip文件。但是解压后zip文件删除不掉,总是有程序占用,后来经过调试发现几个流对象没有关闭。
   下面给出正确的程序:
 
// zipFileName为要解压缩的zip为文件名,例:c:\\filename.zip
// outputDirectoty为解压缩后文件名,例:c:\\filename
 
public void unZip(String zipFileName, String outputDirectory)
       throws Exception {
  InputStream in = null;
  FileOutputStream out = null;
   try {
      zipFile = new ZipFile(zipFileName);
      java.util.Enumeration e = zipFile.getEntries();
       // org.apache.tools.zip.ZipEntry zipEntry = null;
      createDirectory(outputDirectory, "");
       while (e.hasMoreElements()) { 
          zipEntry = (ZipEntry) e.nextElement(); 
          System.out.println( "unziping " + zipEntry.getName());
     if (zipEntry.isDirectory()) {
        String name = zipEntry.getName();
        name = name.substring(0, name.length() - 1);
        File f = new File(outputDirectory + File.separator + name);
        f.mkdir();
        System.out.println( "创建目录:" + outputDirectory
          + File.separator + name);
    } else {
        String fileName = zipEntry.getName();
        fileName = fileName.replace('\\', '/');
         // System.out.println("测试文件1:" +fileName);
         if (fileName.indexOf( "/") != -1) {
        createDirectory(outputDirectory, fileName.substring(0,
        fileName.lastIndexOf( "/")));
        fileName = fileName.substring(
        fileName.lastIndexOf( "/") + 1, fileName
          .length()); 
       }
         try {
          f = new File(outputDirectory + File.separator
               + zipEntry.getName());

           in = zipFile.getInputStream(zipEntry);
          out = new FileOutputStream(f);

            byte[] by = new byte[100000];
            int c;
           while ((c = in.read(by)) != -1) {
               out.write(by, 0, c); 
           }
           out.flush();
        } catch (Exception ee) {

        } finally {
             if (in != null) {
            in.close();        //解压完成后注意关闭输入流对象
      }
       if (out != null) {
            out.close();      //解压完成后注意关闭输出流对象
      } 
    } 
  } 
} catch (Exception ex) {
         System.out.println(ex.getMessage());
  } finally {
      zipFile.close();        //解压完成后注意关闭apache自带zip流对象
  } 
}