powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / java.util.zip.ZipOutputStream
7 сообщений из 7, страница 1 из 1
java.util.zip.ZipOutputStream
    #38128068
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер, коллеги. Поделитесь опытом, если кто знает.

У меня есть несколько входных потоков. Из каждого потока мне надо выкачать данные и сжать их в zip файлы (по одному zip файлу для каждого потока). В результате получу несколько zip файлов. Эти zip файлы мне тоже надо зазиповать в один общий zip.
Для определенности, пусть имеется два входных потока
InputStream1 -> content1.zip
InputStream2 -> content2.zip
в итоге эти два архивчика мне надо зазиповать в Documents.zip

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

Для этого мне нужен OutputStream, в который можно писать данные порциями (в него будет писать ZipOutputStream при архивировании content1.zip), и сразу же из него эти порции считывать чтобы записать в Documents.zip. Т.е. такой фиктивный поток, типа Pipe - написал в него 1024 байта и тут же их считал. Но PipedOutputStream/PipedInputStream мне не подходят, они же для того чтобы создать Pipe между разными потоками? Можно конечно и в одном потоке аккуратно использовать...
Что пришло в голову, так это взять и имплементировать свой OutputStream как мне надо. Но призадумался, может что-нибудь уже есть?
...
Рейтинг: 0 / 0
java.util.zip.ZipOutputStream
    #38128071
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Piped нужны для обмена данными между потоками. IOUtils.copy() здесь должно хватить.
...
Рейтинг: 0 / 0
java.util.zip.ZipOutputStream
    #38128072
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPiped нужны для обмена данными между потоками. IOUtils.copy() здесь должно хватить.

Про commons apache-то я и забыл.. Спасибо большое за ответ!
...
Рейтинг: 0 / 0
java.util.zip.ZipOutputStream
    #38128090
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter,

Не, не подходит. IOUtils#copy копирует из InputStream в OutputStream. Мне же надо такой OutputStream, в который можно писать порциями и сразу же эти порции считывать.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char[] buffer = new char[1024];
char[] zippedData = new char[1024];
ZipOutputStream zos = new ZipOutputStream(outputStream);
ZipOutputStream resultZip = new ZipOutputStream(new FileOutputStream(...));
while(...) {
   ...
   zos.write(buffer); // заархивирует данные из buffer
   zippedData = outputStream.getData() // что-то вроде этого - получили то, что только что заархивировали из buffer
   resultZip.write(zippedData); // добавили эти данные в основной архив
}



Т.е. нужен такой OutputStream, из которого можно считать все, что в него записала последняя write операция.
Я склоняюсь к тому, чтобы самому такой реализовать, там совсем тривиально должно быть.
Но чем больше я думаю, тем больше мне кажется что это какая-то городушка получается. Должно существовать более простое решение.
...
Рейтинг: 0 / 0
java.util.zip.ZipOutputStream
    #38128097
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, надо определенно свою имплементацию OutpouStream писать.
ZipOutputStream пишет во внутрилежащий поток порциями, но не регулярно, видимо только когда у него переполняется личный внутренний буфер. Вообще он наследует FilterOutputStream.
...
Рейтинг: 0 / 0
java.util.zip.ZipOutputStream
    #38129418
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или смешались в кучу zip и gzip/deflate или элементы в zip-архив добавляет ZipEntry .

P.S. Jar , опять-таки.
P.P.S. Commons Compress ?
...
Рейтинг: 0 / 0
java.util.zip.ZipOutputStream
    #38129451
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter... бред какой-то

Если так сделать, что именно не получается?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ZipOutputStream main = new ZipOutputStream(destination);
for(InputStream source : sources){
   main.putNextEntry(...);
   inner = new ZipOutputStream(main);
   inner.putNextEntry(...);
   IOUtils.copy(source, inner);
   inner.closeEntry();
   inner.close();
   main.closeEntry();
}
main.close();
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / java.util.zip.ZipOutputStream
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]