Skip to content

Como salvar em uma zipstream em modo STORED?

Estou usando o HTTP/1.1 (#526) para fazer download de múltiplos recursos. Devido a um problema de performance (#519 (closed)), estou salvando em um único arquivo tudo o que recebo. Na inexistência do suporte ao tarball, estou salvando em um zip com o modo STORED.

Por uma questão de comodidade, eu crio uma j.i.OutputStream onde posso escrever o resultado do download. Estou criando essa j.i.OutputStream desse jeito:

ZipStream zip = getZipStream(nomeBase);
ZipEntry entry = new ZipEntry(nomeInterno);
entry.setMethod(ZipEntry.STORED);

OutputStream zipAsOutput = zip.asOutputStream();

return new OutputStream() {
	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	CRC32 crc = new CRC32();
	
	@Override
	public void write(int b) throws java.io.IOException {
		baos.write(b);
		crc.update(b);
	}
	
	@Override
	public void write(byte[] b, int off, int len) throws java.io.IOException {
		baos.write(b, off, len);
		crc.update(b, off, len);
	}
	
	@Override
	public void close() throws java.io.IOException {
		byte[] b = baos.toByteArray();
		entry.setSize(b.length);
		entry.setCompressedSize(b.length);
		
		entry.setCrc(crc.getValue());
		zip.putNextEntry(entry);
		zipAsOutput.write(b);
		zip.closeEntry();
	}
};

Onde a função getZipStream me retorna um multiton identificado por nomeBase.

A questão toda é: a nível de SDK, esse código funciona perfeitamente. Porém, no dispositivo, recebo esse alerta:

Warning! totalcross.util.zip.ZipException: Method STORED, but crc not set
totalcross.util.zip.ZipStream.putNextEntry
br.com.softsite.sav.container.imgcollection.ImgDownloader$1.close 87
br.com.softsite.sav.container.imgcollection.ImgDownloader.gravaImagem 157
br.com.softsite.sav.container.imgcollection.ImgDownloader$2.run 203

E não executa mais os passos seguintes (onde eu esperaria ter um update no banco, por exemplo). Porém a imagem é escrita no meu zip, e isso é o mais bizarro. O arquivo está sendo salvo e ocorre o update no banco de dados.

Como preciso prosseguir para salvar um array de bytes em um ZIP?

Tem o ponto que no javadoc da classe ZipFile ela se indica como deprecada, portanto eu evito o seu uso

/** @deprecated This class was never fully implemented. Use ZipStream instead. */

Edited by Jefferson Quesado