Skip to content
GitLab
  • Menu
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
    • Switch to GitLab Next
  • Sign in / Register
  • TotalCross TotalCross
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 102
    • Issues 102
    • List
    • Boards
    • Service Desk
    • Milestones
    • Requirements
  • Merge requests 2
    • Merge requests 2
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • TotalCrossTotalCross
  • TotalCrossTotalCross
  • Issues
  • #529
Closed
Open
Created May 23, 2019 by Jefferson Quesado@jefferson.quesadoContributor

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 May 23, 2019 by Jefferson Quesado
Assignee
Assign to
Time tracking