关于java.util.z iip使用的一些疑问。*

时间:2011-09-16 23:58:51

标签: java zip unzip

我有代码解压缩zip文件的内容(如果必须创建一个目录,那么也会创建该目录。)

但我想检查以下内容 - (1)从zip解压缩文件时,检查文件是否已存在,并根据用户在运行时指定的值,覆盖该文件或保留原始文件。

具体应该是指定行下面的代码行,它检查特定名称的文件是否已经存在于该位置?

下面分别给出了检查(存在文件)之前的代码行...

copyInputStream(zipFile.getInputStream(entry),
           new BufferedOutputStream(new FileOutputStream(entry.getName())));

(2)如何检查指定名称的目录是否已存在。在以下代码之前需要进行此检查 -

(new File(entry.getName())).mkdir();

程序的整个代码如下 -

import java.io.*;
import java.util.*;
import java.util.zip.*;


public class Unzip {

  public static final void copyInputStream(InputStream in, OutputStream out)
  throws IOException
  {
    byte[] buffer = new byte[1024];
    int len;

    while((len = in.read(buffer)) >= 0)
      out.write(buffer, 0, len);

    in.close();
    out.close();
  }

  public static final void main(String[] args) {
    Enumeration entries;
    ZipFile zipFile;

    if(args.length != 1) {
      System.err.println("Usage: Unzip zipfile");
      return;
    }

    try {
      zipFile = new ZipFile(args[0]);

      entries = zipFile.entries();

      while(entries.hasMoreElements()) {
        ZipEntry entry = (ZipEntry)entries.nextElement();

        if(entry.isDirectory()) {
          // Assume directories are stored parents first then children.
          System.err.println("Extracting directory: " + entry.getName());
          // This is not robust, just for demonstration purposes.
          (new File(entry.getName())).mkdir();
          continue;
         }

        System.err.println("Extracting file: " + entry.getName());
        copyInputStream(zipFile.getInputStream(entry),
           new BufferedOutputStream(new FileOutputStream(entry.getName())));
      }

      zipFile.close();
    } catch (IOException ioe) {
      System.err.println("Unhandled exception:");
      ioe.printStackTrace();
      return;
    }
  }

} 

3 个答案:

答案 0 :(得分:3)

您可能希望在java.io.File API doc中搜索“存在”一词。

答案 1 :(得分:1)

您需要使用java.io.File检查文件夹或目录是否存在,如下所示:

// first obtain the base path where you are running your code
URL url = getClass().getClassLoader().getResource(".");

// then check for the existence of the file you need
File f = new File(url.getPath() + entry.getName());

// check for the flag to overwrite the file or it doesn't exist
if(!file.exists() || overwrite) {

    copyInputStream(zipFile.getInputStream(entry),
               new BufferedOutputStream(new FileOutputStream(entry.getName())));

}

检查文件夹是否存在可以使用相同的方法。

答案 2 :(得分:0)

File课程有existsisFileisDirectory方法可用于您的目的。

只需使用:

boolean ovrParam = // read flag from args array

// and inside the loop
File file = new File(entry.getName());
if(ovrParam || !file.exists()) {
   copyInputStream(zipFile.getInputStream(entry),
       new BufferedOutputStream(new FileOutputStream(entry.getName())));
}

当然,组合目录和文件可能会让我更加棘手(例如,您可以在文件系统中提取一个文件夹提取位置,并且zip包含一个文件,其文件夹的名称与您要解压缩的文件夹完全相同,或者可能是逆)。但无论如何,这应该给你一个指导。

干杯,