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!

questionAnswers(3)

yourAnswerToTheQuestion