некоторые вопросы относительно использования java.util.z iip.*

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

} 

person user893664    schedule 16.09.2011    source источник
comment
Вам нужно будет уточнить, какая именно помощь вам нужна. В настоящее время это звучит так, как будто вы просите кого-то сделать вашу работу/домашнее задание за вас.   -  person Ryan Stewart    schedule 17.09.2011
comment
привет... я отредактировал вопрос, чтобы было более понятно, о чем я прошу...   -  person user893664    schedule 17.09.2011
comment
Это очень пахнет домашним заданием. Это?   -  person Philipp Reichart    schedule 17.09.2011
comment
ну, это не домашняя работа ... это профессиональная работа :( я перегружен большим количеством работы (все в java) со сжатыми сроками, и я впервые использую функцию распаковки в java :(   -  person user893664    schedule 17.09.2011


Ответы (3)


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

}

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

person Nacho Cougil    schedule 17.09.2011

Вы можете выполнить поиск в документе java.io.File API. для слова "существует".

person Philipp Reichart    schedule 17.09.2011

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

Ваше здоровье,

person Anthony Accioly    schedule 17.09.2011