Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Как прочитать *.zip файл в массив байт  [new]
mr_virtus
Member

Откуда:
Сообщений: 876
Пытаюсь прочитать zip файл, пока безуспешно.

File zipFile = new File("pathToZip");
Path path   = zipFile.toPath();
InputStream input = new BufferedInputStream(Files.newInputStream(path));

InputStream in = new ZipInputStream(input);

byte[] buffer = new byte[1024];

while (in.read(buffer) != -1) {}


read возвращает -1, хотя файл не пустой.
Что я делаю не так?
25 апр 19, 16:21    [21871850]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mayton
Member

Откуда: loopback
Сообщений: 41377
Там не так. Зип архив состоит из файликов. И их получают через ZipEntry. Посмотри примеры их полно.
25 апр 19, 16:23    [21871852]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mr_virtus
Member

Откуда:
Сообщений: 876
mayton,

https://stackoverflow.com/questions/14603319/getinputstream-for-a-zipentry-from-zipinputstream-without-using-the-zipfile-cla


автор
Err, the ZipInputStream already is an InputStream. You don't need another one. Getting the next ZipEntry positions the stream at the beginning of the entry. See the Javadoc.


Почему то пишут, что и с ZipInputStream должно быть ок. Может я конечно не правильно понимаю.
25 апр 19, 16:40    [21871867]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mr_virtus
Member

Откуда:
Сообщений: 876
mayton,

while ((in.getNextEntry()) != null) {
    byte[] buffer = new byte[1024];

    while (in.read(buffer) != -1) {}
}


Так вроде заработало.
25 апр 19, 16:50    [21871877]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mr_virtus
Member

Откуда:
Сообщений: 876
mayton, спасибо.
25 апр 19, 16:50    [21871878]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mayton
Member

Откуда: loopback
Сообщений: 41377
mr_virtus,

Да. А вот если-бы ты использовал GZip - то там связь архива и архивируемого потока была-бы 1:1.
25 апр 19, 17:13    [21871907]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mr_virtus
Member

Откуда:
Сообщений: 876
File zipFile = new File("pathToZip");
Path path   = zipFile.toPath();
InputStream input = new BufferedInputStream(Files.newInputStream(path));

byte[] buffer = new byte[1024];

while (in.read(buffer) != -1) {}


Так тоже заполняет буфер, но содержимое буфера отличается если писать так

InputStream in = new ZipInputStream(input);
while ((in.getNextEntry()) != null) {
    byte[] buffer = new byte[1024];

    while (in.read(buffer) != -1) {}
}


?
25 апр 19, 17:16    [21871909]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mayton
Member

Откуда: loopback
Сообщений: 41377
Мне кажется что ты теряешь ZipEntry. Этож шаблон итератора и с ним надо работать аккуратно.

Смотри как тут https://metanit.com/java/tutorial/6.12.php
25 апр 19, 17:22    [21871911]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mr_virtus
Member

Откуда:
Сообщений: 876
mayton,

говорят zip файл содержит еще метаданные. Поэтому если читать без ZipEntry, то есть вероятность что читаешь сначала как раз их, а не содержимое самих entries. Поэтому возможно содержание массивов различается.
25 апр 19, 17:37    [21871924]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mayton
Member

Откуда: loopback
Сообщений: 41377
Я не понимаю о чем-ты. Посмотри поля ZipEntry. Size. Compressed Size. CRC. Это и есть метаданные.

Или ты имел в виду что-то другое.
25 апр 19, 18:04    [21871940]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mr_virtus
Member

Откуда:
Сообщений: 876
mayton,

ну да. Только если не использовать ZipInputStream, а читать просто как

InputStream input = new BufferedInputStream(Files.newInputStream(path));

byte[] buffer = new byte[1024];

while (in.read(buffer) != -1) {}


то как раз и выходит, что

автор
Посмотри поля ZipEntry. Size. Compressed Size. CRC
попадают в мой буффер. А мне они не нужны. Мне нужны только "пользовательские данные запакованные".
25 апр 19, 18:13    [21871948]     Ответить | Цитировать Сообщить модератору
 Re: Как прочитать *.zip файл в массив байт  [new]
mr_virtus
Member

Откуда:
Сообщений: 876
mayton,

да, имел в виду это. Не точно выразился. Спасибо.
25 апр 19, 18:14    [21871950]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить