java.util.zip - ZipInputStream v.s. ZipFile
Tenho algumas perguntas gerais sobre ojava.util.zip
biblioteca. O que basicamente fazemos é uma importação e exportação de muitos componentes pequenos. Anteriormente, esses componentes eram importados e exportados usando um único arquivo grande, por exemplo:
<component-type-a id="1"/>
<component-type-a id="2"/>
<component-type-a id="N"/>
<component-type-b id="1"/>
<component-type-b id="2"/>
<component-type-b id="N"/>
Observe que a ordem dos componentes durante a importação é relevante.
Agora, cada componente deve ocupar seu próprio arquivo, que deve serexternamente versionado, com controle de qualidade, bla, bla. Decidimos que a saída de nossa exportação deve ser um arquivo zip (com todos esses arquivos inseridos) e a entrada de nossa importação deve ser um arquivo zip semelhante. Não queremos explodir o zip no nosso sistema. Não queremos abrir fluxos separados para cada um dos arquivos pequenos. Minhas perguntas atuais:
Q1 Pode oZipInputStream
garantimos que as entradas zip (os pequenos arquivos) sejam lidas na mesma ordem em que foram inseridas pela nossa exportação que utilizaZipOutputStream
? Eu suponho que a leitura é algo como:
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null)
{
//read from zis until available
}
Eu sei que o diretório zip central é colocado no final do arquivo zip, mas, mesmo assim, as entradas do arquivo têm ordem sequencial. Sei também que confiar na ordem é uma ideia feia, mas só quero ter todos os fatos em mente.
Q2 Se eu usarZipFile
(qual eu prefiro) qual é o impacto no desempenho da chamadagetInputStream()
centenas de vezes? Será muito mais lento que oZipInputStream
solução? O zip é aberto apenas uma vez eZipFile
é apoiado porRandomAccessFile
- isso está correto? Eu suponho que a leitura é algo como:
ZipFile zipfile = new ZipFile(argv[0]);
Enumeration e = zipfile.entries();//TODO: assure the order of the entries
while(e.hasMoreElements()) {
entry = (ZipEntry) e.nextElement();
is = zipfile.getInputStream(entry));
}
Q3 Os fluxos de entrada são recuperados do mesmoZipFile
thread safe (por exemplo, posso ler entradas diferentes em threads diferentes simultaneamente)? Alguma penalidade de desempenho?
Obrigado por suas respostas!