У меня есть требование, согласно которому я должен создать zip-файл из списка доступных файлов. Файлы бывают разных типов, например txt, pdf, xml и т. Д. Я использую для этого классы java util.
Здесь требуется поддерживать максимальный размер файла 5 МБ. Я должен выбрать файлы из списка на основе отметки времени, добавить файлы в zip, пока размер zip-файла не достигнет 5 МБ. Остальные файлы следует пропустить.
Пожалуйста, дайте мне знать, есть ли в java способ, с помощью которого я могу заранее оценить размер zip-файла, не создавая фактический файл?
Или есть какой-либо другой способ справиться с этим
Оберните ZipOutputStream в персонализированный OutputStream, названный здесь YourOutputStream.
ZipOutputStream
(zos2), который обертывает новый ByteArrayOutputStream
(baos)public YourOutputStream(ZipOutputStream zos, int maxSizeInBytes)
YourOutputStream
, он сначала запишет его на zos2public void writeFile(Файловый файл) выбрасывает ZipFileFullException
public void writeFile(String path) выбрасывает ZipFileFullException
baos.size()
меньше maxSizeInBytes
Вам нужно два ZipOutputStream, один для записи на ваш диск, а другой для проверки, превышает ли ваше содержимое 5 МБ.
РЕДАКТИРОВАТЬ: На самом деле я проверил, вы не можете легко удалить ZipEntry.
http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html#size()
Возможно, вы могли бы добавлять файл каждый раз, пока не достигнете ограничения в 5 МБ, а затем удалить последний файл. Как и @Gopi, я не думаю, что есть какой-либо способ оценить это без фактического сжатия файла.
Разумеется, размер файла не увеличится (или, может быть, немного, из-за заголовка zip?), так что, по крайней мере, у вас есть оценка «наихудшего случая».
+1 для Колина Герберта: Добавляйте файлы по одному, либо сделайте резервную копию предыдущего шага, либо удалите последний файл, если архив слишком большой. Я просто хочу добавить некоторые детали:
Предсказания слишком ненадежны. Напр. PDF-файл может содержать несжатый текст и сжиматься до 30% от оригинала или содержать уже сжатый текст и изображения, сжатые до 80%. Вам нужно будет проверить весь PDF-файл на сжимаемость, в основном сжимая их.
Вы можете попробовать статистический прогноз, но это уменьшит количество неудачных попыток, но вам все равно придется выполнить приведенную выше рекомендацию. Сначала перейдите к более простой реализации и посмотрите, достаточно ли этого.
В качестве альтернативы можно сжимать файлы по отдельности, а затем выбирать файлы, размер которых не превышает 5 МБ, если они связаны вместе. Если распаковка также автоматизирована, вы можете связать zip-файлы в один несжатый zip-файл.
Я сделал это однажды в проекте с известными типами ввода. Мы знали, что, вообще говоря, наши данные сжаты примерно 5:1 (все это был текст). Поэтому я проверял размер файла и делил на 5...
В данном случае целью этого было проверить что файлы, вероятно, будут меньше определенного размера. Нам нужна была только приблизительная оценка.
При этом я заметил, что zip-приложения, такие как 7zip, создают zip-файл определенного размера (например, компакт-диск), а затем разделяют zip-архив на новый файл, как только он достигает предела. Вы можете посмотреть на этот исходный код. Я фактически использовал версию командной строки этого приложения в коде раньше. У них есть библиотека, которую вы также можете использовать. Не уверен, насколько хорошо это будет интегрироваться с Java.
Я также использовал библиотеку SharpZipLib. Это было очень хорошо. Интересно, есть ли для него порт Java.