我有一些關於java.util.zip
庫的一般問題。 我們基本上做的是導入和導出許多小組件。以前這些成分是進口和使用單個大文件,例如: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"/>
請注意,組件的進口過程中的順序是相關的出口。
現在每個組件應該佔據自己的文件應該是外部版本,QA-ED,BLA BLA。我們決定輸出的輸出應該是一個zip文件(包含所有這些文件),我們輸入的輸入應該是一個類似的zip文件。我們不想在我們的系統中爆炸拉鍊。我們不希望爲每個小文件打開單獨的流。我目前的問題:
Q1。可能ZipInputStream
保證壓縮條目(小文件)的讀取順序與我們使用ZipOutputStream
的導出時插入的順序相同?我認爲閱讀是一樣的東西:
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null)
{
//read from zis until available
}
我知道,中央拉鍊目錄將被置於在zip文件的末尾但儘管如此裏面的文件條目具有順序。我也知道依靠這個命令是一個醜陋的想法,但我只想記住所有的事實。 Q2302。如果我使用ZipFile
(我更喜歡),那麼調用getInputStream()
幾百次會帶來怎樣的性能影響?它會比ZipInputStream
解決方案慢嗎?該郵編只打開一次,ZipFile
支持RandomAccessFile
- 這是正確的嗎? 我假設讀數是這樣的:
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。是否從相同的ZipFile
線程安全地檢索輸入流(例如,我可以同時在不同線程中讀取不同的條目)?任何表現處罰?
感謝您的回答!
嗨StaxMan!我只是在JDK6中檢查ZipFile $ ZipFileInputStream的實現。這是由ZipFile.getInputStream返回它有同步,但我真的不知道這是多麼可靠。 – 2011-01-11 18:05:14
是的,我不能肯定地說它是非線程安全的。另一個更危險的部分是底層本地zlib庫,我懷疑它不是線程安全的。 – StaxMan 2011-01-11 18:07:35