Ho alcune domande generali sulla libreria java.util.zip
. Quello che fondamentalmente facciamo è un'importazione e un'esportazione di molti piccoli componenti. In precedenza questi componenti sono stati importati ed esportati utilizzando un unico grande file, ad es .:java.util.zip - ZipInputStream v.s. ZipFile
<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"/>
Si prega di notare che l'ordine dei componenti durante l'importazione è rilevante.
Ora ogni componente dovrebbe occupare un proprio file che dovrebbe essere esternamente versione, QA-ed, bla, bla. Abbiamo deciso che l'output della nostra esportazione dovrebbe essere un file zip (con tutti questi file in) e l'input della nostra importazione dovrebbe essere un file zip simile. Non vogliamo far esplodere lo zip nel nostro sistema. Non vogliamo aprire flussi separati per ciascuno dei piccoli file. Le mie attuali domande:
Q1. Può il ZipInputStream
garantire che le voci zip (i piccoli file) vengano lette nello stesso ordine in cui sono state inserite dalla nostra esportazione che utilizza ZipOutputStream
? Presumo lettura è qualcosa di simile:
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null)
{
//read from zis until available
}
So che la directory centrale zip è messo alla fine del file zip, ma comunque le voci del file all'interno avere ordine sequenziale. So anche che fare affidamento sull'ordine è una brutta idea, ma voglio solo avere tutti i fatti in mente.
Q2. Se utilizzo ZipFile
(che preferisco) qual è l'impatto sulle prestazioni della chiamata a getInputStream()
centinaia di volte? Sarà molto più lento della soluzione ZipInputStream
? Lo zip è aperto una sola volta e ZipFile
è supportato da RandomAccessFile
- è corretto? presumo la lettura è qualcosa di simile:
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. I flussi di input sono recuperati dallo stesso thread di sicurezza ZipFile
(ad esempio, posso leggere voci diverse in thread diversi contemporaneamente)? Qualche penalità per le prestazioni?
Grazie per le vostre risposte!
Hi StaxMan! Stavo controllando l'implementazione di ZipFile $ ZipFileInputStream in JDK6. Questo viene restituito da ZipFile.getInputStream. Ha la sincronizzazione anche se non so davvero quanto sia affidabile. –
Sì, non posso dire per certo che sia privo di thread. Un'altra parte pericolosa è la sottostante libreria nativa di zlib, che sospetto non sia sicura per i thread. – StaxMan
Posso testimoniare che non è infallibile, attraverso un'esperienza dolorosa. – Joel