Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ZIP 
V
    Опции темы
Sherst
Дата 31.3.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Привет всем!
Написал метод, который архивирует директорию, но возникла необходимость заархивироть файл *.html. Т.е. сам файл + папку с ресурсами html-страницы. Вот мой код:

Код

  public static void zipDir(String dir2zip, ZipOutputStream zos) {
    try {
      File zipDir = new File(dir2zip);
      //
      //get a listing of the directory content
      String[] dirList = zipDir.list();
      byte[] readBuffer = new byte[64 * 1024];
      int bytesIn = 0;
      //loop through dirList, and zip the files
      for (int i = 0; i < dirList.length; i++) {
        File f = new File(zipDir, dirList[i]);
        System.out.println(f.getAbsolutePath());
        if (f.isDirectory()) {
          //if the File object is a directory, call this
          //function again to add its content recursively
          String filePath = f.getPath();
          zipDir(filePath, zos);
          //loop again
          continue;
        }
        //if we reached here, the File object f was not a directory
        //create a FileInputStream on top of f
        FileInputStream fis = new FileInputStream(f);
        //create a new zip  entry
        ZipEntry anEntry = new ZipEntry(f.getPath().substring(f.getPath().indexOf(File.separatorChar)+1));
        //place the zip entry in the ZipOutputStream object
        zos.putNextEntry(anEntry);
        //now write the content of the file to the ZipOutputStream
        while ((bytesIn = fis.read(readBuffer)) != -1) {
          zos.write(readBuffer, 0, bytesIn);
        }
        //close the Stream
        fis.close();
      }
    } catch (Exception e) {
      //handle exception
    }
  }


Не могу понять как в методе реализовать архивирование самого html-файла , а не только одной директории.
PM MAIL   Вверх
LSD
Дата 31.3.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Не понимаю? Он нормально архивирует, и файл и подкаталоги. Чего не хватает?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Sherst
Дата 31.3.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Не совсем.
У меня например такая строка не работает:

Код

  ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("C:\\test.zip"));
  zipDir("C:\\Test\\Scandisk.txt", zos);
  zos.close();

Пишет:
java.util.zip.ZipException: ZIP file must have at least one entry

Проблема в том, что в том методе у меня есть параметр директории которую надо заархивировать мне надо добавить и реализовать еще один параметр имя файла.
public static void zipDir(String dir2zip,String fileName, ZipOutputStream zos)

По этому параметру я выбераю html-файл и ложу его в архив вместе с папкой , в которой хранятся ресурсы данного html-файла.
PM MAIL   Вверх
LSD
Дата 31.3.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Сделай так:
Код
  public static void zipDir(File dir2zip, ZipOutputStream zos) throws IOException
  {
    if(dir2zip.isDirectory())
    {
      String[] dirList = dir2zip.list();
      for(int i = 0; i < dirList.length; i++)
      {
        File f = new File(dir2zip, dirList[i]);
        System.out.println(f.getAbsolutePath());
        if(f.isDirectory())
        {
          zipDir(dir2zip, zos);
          continue;
        }
        zipFile(f, zos);
      }
    }
    else
    {
      zipFile(dir2zip, zos);
    }
  }

  public static void zipFile(File zipFile, ZipOutputStream zos) throws IOException
  {
    byte[] readBuffer = new byte[64 * 1024];
    FileInputStream in = new FileInputStream(zipFile);
    ZipEntry anEntry = new ZipEntry(zipFile.getPath().substring(zipFile.getPath().indexOf(File.separatorChar) + 1));
    zos.putNextEntry(anEntry);
    int bytesIn;
    while((bytesIn = in.read(readBuffer)) != -1)
      zos.write(readBuffer, 0, bytesIn);
    in.close();
  }

А затем вызывай так:
Код
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("C:\\TEMP\\my.zip"));
zipFile(new File("C:\\TEMP\\1\\someText.txt"), zipOut);
zipDir(new File("C:\\TEMP\\1\\msohtml"), zipOut);
zipOut.finish();
zipOut.close();



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Sherst
Дата 1.4.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 26.10.2005

Репутация: нет
Всего: 2



Спасибо LSD.
Все нормально работает.
PM MAIL   Вверх
LSD
Дата 1.4.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Пожалуйста.
Только не забывай помечать вопрос как решённый.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Kee_Keekkenen
Дата 13.6.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 16.2.2007

Репутация: нет
Всего: нет



вопрос в догонку - можно ли как-то регулировать кодировку имен файлов в выше приведенном способе архивации, а то если в именах файлов есть русские имена, то при открытии  архива, созданного таким способом,  имена не в той кодировке.. ?
PM MAIL   Вверх
kkorsakoff
Дата 13.6.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 14



Нельзя, это известный старый баг (с 2003 годаsmile )

http://bugs.sun.com/bugdatabase/view_bug.d...?bug_id=4820807

Выход может быть в использовании пакета org.apache.tools.zip.*. Там можно устанавливать кодировку имен файлов.


PM MAIL WWW ICQ   Вверх
Kee_Keekkenen
Дата 13.6.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 16.2.2007

Репутация: нет
Всего: нет



так я и думал, ибо не смог..
PM MAIL   Вверх
niasilil
Дата 16.6.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



а в чем преимущество 
byte[] readBuffer = new byte[64 * 1024];
перед использованием BufferedReader? 

Почему так?


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
LSD
Дата 17.6.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(niasilil @  16.6.2007,  21:09 Найти цитируемый пост)
а в чем преимущество 
byte[] readBuffer = new byte[64 * 1024];
перед использованием BufferedReader? 

В скорости:
Код
import java.io.*;
import java.util.zip.*;

public class ZipTest
{
  private static byte[] readBuffer = new byte[64 * 1024];

  public static void zipDir(File dir2zip, ZipOutputStream zos) throws IOException
  {
    if(dir2zip.isDirectory())
    {
      File[] dirList = dir2zip.listFiles();
      for(File dir : dirList)
      {
        System.out.println(dir.getAbsolutePath());
        if(dir.isDirectory())
        {
          zipDir(dir, zos);
          continue;
        }
        zipFile(dir, zos);
      }
    }
    else
    {
      zipFile(dir2zip, zos);
    }
  }
  //*/
  public static void zipFile(File zipFile, ZipOutputStream zos) throws IOException
  {
    FileInputStream in = new FileInputStream(zipFile);
    ZipEntry anEntry = new ZipEntry(zipFile.getPath().substring(zipFile.getPath().indexOf(File.separatorChar) + 1));
    zos.putNextEntry(anEntry);
    int bytesIn;
    while((bytesIn = in.read(readBuffer)) != -1)
      zos.write(readBuffer, 0, bytesIn);
    in.close();
  }
  /*/
  public static void zipFile(File zipFile, ZipOutputStream zos) throws IOException
  {
    InputStream in = new BufferedInputStream(new FileInputStream(zipFile));
    ZipEntry anEntry = new ZipEntry(zipFile.getPath().substring(zipFile.getPath().indexOf(File.separatorChar) + 1));
    zos.putNextEntry(anEntry);
    int b;
    while((b = in.read()) != -1)
      zos.write(b);
    in.close();
  }
  //*/
  public static void main(String[] args) throws IOException
  {
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("C:\\TEMP\\1\\test.zip"));
    long time = System.currentTimeMillis();
    zipDir(new File("C:\\TEMP\\2"), zos);
    time = System.currentTimeMillis() - time;
    System.out.println("time = " + time);
    zos.close();
  }
}

сравни по скорости первый вариант и второй. Плюс ко всему, в первом варианте меньше выделений памяти.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
niasilil
Дата 18.6.2007, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



В 10 раз отличие - весело. Ух ты. 
Спасибо.


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0938 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.