LINUX.ORG.RU

InputStream from zip file

 ,


0

1

Привет всем! Пусть есть zip-архив - file.zip. В архиве несколько файлов, имена которых мы не знаем.

Есть ли способ получить общий InputStream, с помощью которого мы последовательно обойдем все файлы в архиве?

Т.е если файл один в архиве:

//inputStream - это input stream на наш файл.
public BufferedReader getReader(InputStream inputStream) {
final ZipInputStream zin = new ZipInputStream(inputStream);
zin.nextEntry();
return new BufferedReader(new InputStreamReader(zin))
}

//BufferedReader - стрим на архив

А если их несколько?

Нужно именно получить один некий общий стрим на все. Вижу только вариант считывать каждый entry в байт массив и из него делать стрим, а дальше их склеивать в один.

Но так не хочется делать.

Может подскажет кто идею? Спасибо!


Разрешаю.
Имплементируете интерфейс InputStream который внутри хранит список стримов на конкретные файлы в архиве, и методы read читают из них по порядку данные. Не обязательно заранее читать, можно читать когда надо, а это метод read в конце концов. Я таким образом из пачки бинарных структур лежащих в файле в методе read на лету рожал xml структуру(так надо было).

FeyFre ★★★★
()
Ответ на: комментарий от FeyFre

Я понимаю, что можно написать такое - я спрашивал, нет ли УЖЕ подобного? Чтобы не писать свой велосипед, а воспользоваться уже чьим-то.

Если вы подобное делали, то не поделитесь исходниками?

aarexer
() автор топика
Последнее исправление: aarexer (всего исправлений: 1)
Ответ на: комментарий от FeyFre

Я знаю, это сольет мне два стрима в один, окей. Вопрос в том, как вы будете из ZipInputStream получать на каждый Entry свой стрим?

Не из ZipFile, а из ZipInputStream.

aarexer
() автор топика
Последнее исправление: aarexer (всего исправлений: 1)
Ответ на: комментарий от aarexer

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

anonymous
()
Ответ на: комментарий от anonymous

Я спросил совет.

Если ты не знаешь что ответить и просто хочешь что-то написать - это круто(на самом деле нет).

aarexer
() автор топика
Ответ на: комментарий от FeyFre

Просто getNextEntry() сдвигает стрим мне:

 Reads the next ZIP file entry and positions the stream at the
     * beginning of the entry data.

И как мне на каждую entry сделать стрим - не понимаю.

aarexer
() автор топика
Ответ на: комментарий от aarexer

Руками. Я уже говорил выше - в методе read читает со своего зип-стрима, как только дошли до конца, то вызываете в нем(зип-стриме) getNextEntry(), он перенаправится внутри на новые данные, и читаются данные нового файла, пока не дойдем до конца. Программирования логики на 5 минут,дюжина строчек, вместе с чтением документации по зип-стриму.

FeyFre ★★★★
()
Ответ на: комментарий от aarexer

Не нужно на каждую. Достаточно read-ом вовремя вызывать getNextEntry() что-бы стрим начал глядеть на новые данные. Вы реализуете InputStream приблизительно так:

class ZipSeqInputStream implements InputStream {
	private ZipInputStream input;
	//! другие методы
	public int read(byte[] buffer) {
		int res = input.read(buffer);
		if( res != -1) return res;
		if( null == input.GetNextEntry())
			return -1;
		return input.read(buffer);
	}
}
Реализуете остальные методы InputStream, которые будут работать подобным образом.(этот кусок кода я выше вам на словах рассказал уже)

FeyFre ★★★★
()
Ответ на: комментарий от aarexer

У тебя очень специфическая задача, вряд ли для этого есть готовое решение. Кому может прийти в голову читать все файлы в зип-архиве как единый поток? В этом нет никакого смысла в общем случае.

Legioner ★★★★★
()
Ответ на: комментарий от aarexer

Вмето написать две строчки, вдруг смогу ВЗЯТЬ ГОТОВОЕ и бухнуть с друганами пивасика в падике. Это правильный подход, да.

anonymous
()
Ответ на: комментарий от anonymous

Познакомься с девушкой и расслабься.

aarexer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.