некоторые вопросы относительно использования java.util.z iip. * - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть код для разархивирования содержимого 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 ]

3 голосов
/ 17 сентября 2011

Возможно, вы захотите выполнить поиск в java.io.File API doc по слову «существует».

1 голос
/ 17 сентября 2011

Вам нужно проверить, существуют ли папки или каталог, используя 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())));

}

Проверка наличия папки может быть выполнена с использованием того же подхода.

0 голосов
/ 17 сентября 2011

Файл класс имеет существует , isFile и isDirectory методы для ваших целей.

Просто используйте что-то вроде:

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-файле содержится файл с точно таким же именем вашей папки, который нужно разархивировать, или, может быть, обратное). Но в любом случае это должно дать вам руководство.

Приветствия,

...