Как оценить размер zip-файла в java перед его созданием

У меня есть требование, согласно которому я должен создать zip-файл из списка доступных файлов. Файлы бывают разных типов, например txt, pdf, xml и т. Д. Я использую для этого классы java util.

Здесь требуется поддерживать максимальный размер файла 5 МБ. Я должен выбрать файлы из списка на основе отметки времени, добавить файлы в zip, пока размер zip-файла не достигнет 5 МБ. Остальные файлы следует пропустить.

Пожалуйста, дайте мне знать, есть ли в java способ, с помощью которого я могу заранее оценить размер zip-файла, не создавая фактический файл?

Или есть какой-либо другой способ справиться с этим

15
задан Vignesh 26 August 2010 в 06:05
поделиться

4 ответа

Оберните ZipOutputStream в персонализированный OutputStream, названный здесь YourOutputStream.

  • Конструктор YourOutputStream создаст еще один ZipOutputStream (zos2), который обертывает новый ByteArrayOutputStream (baos)
    public YourOutputStream(ZipOutputStream zos, int maxSizeInBytes)
  • When вы хотите записать файл с помощью YourOutputStream, он сначала запишет его на zos2
    public void writeFile(Файловый файл) выбрасывает ZipFileFullException
    public void writeFile(String path) выбрасывает ZipFileFullException
    и т. д. ...
  • if baos.size() меньше maxSizeInBytes
    • Запишите файл в zos1
  • else
    • закройте zos1, baos, zos2 и создайте исключение. В качестве исключения я не могу придумать уже существующее, если оно есть, используйте его, иначе создайте свое собственное IOException ZipFileFullException.

Вам нужно два ZipOutputStream, один для записи на ваш диск, а другой для проверки, превышает ли ваше содержимое 5 МБ.

РЕДАКТИРОВАТЬ: На самом деле я проверил, вы не можете легко удалить ZipEntry.

http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html#size()

10
ответ дан 1 December 2019 в 04:40
поделиться

Возможно, вы могли бы добавлять файл каждый раз, пока не достигнете ограничения в 5 МБ, а затем удалить последний файл. Как и @Gopi, я не думаю, что есть какой-либо способ оценить это без фактического сжатия файла.

Разумеется, размер файла не увеличится (или, может быть, немного, из-за заголовка zip?), так что, по крайней мере, у вас есть оценка «наихудшего случая».

0
ответ дан 1 December 2019 в 04:40
поделиться

+1 для Колина Герберта: Добавляйте файлы по одному, либо сделайте резервную копию предыдущего шага, либо удалите последний файл, если архив слишком большой. Я просто хочу добавить некоторые детали:

Предсказания слишком ненадежны. Напр. PDF-файл может содержать несжатый текст и сжиматься до 30% от оригинала или содержать уже сжатый текст и изображения, сжатые до 80%. Вам нужно будет проверить весь PDF-файл на сжимаемость, в основном сжимая их.

Вы можете попробовать статистический прогноз, но это уменьшит количество неудачных попыток, но вам все равно придется выполнить приведенную выше рекомендацию. Сначала перейдите к более простой реализации и посмотрите, достаточно ли этого.

В качестве альтернативы можно сжимать файлы по отдельности, а затем выбирать файлы, размер которых не превышает 5 МБ, если они связаны вместе. Если распаковка также автоматизирована, вы можете связать zip-файлы в один несжатый zip-файл.

3
ответ дан 1 December 2019 в 04:40
поделиться

Я сделал это однажды в проекте с известными типами ввода. Мы знали, что, вообще говоря, наши данные сжаты примерно 5:1 (все это был текст). Поэтому я проверял размер файла и делил на 5...

В данном случае целью этого было проверить что файлы, вероятно, будут меньше определенного размера. Нам нужна была только приблизительная оценка.

При этом я заметил, что zip-приложения, такие как 7zip, создают zip-файл определенного размера (например, компакт-диск), а затем разделяют zip-архив на новый файл, как только он достигает предела. Вы можете посмотреть на этот исходный код. Я фактически использовал версию командной строки этого приложения в коде раньше. У них есть библиотека, которую вы также можете использовать. Не уверен, насколько хорошо это будет интегрироваться с Java.

Я также использовал библиотеку SharpZipLib. Это было очень хорошо. Интересно, есть ли для него порт Java.

0
ответ дан 1 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: