Lac*_*lev 8 java io zip thread-safety
我对java.util.zip图书馆有一些一般性的问题.我们基本上做的是导入和导出许多小组件.以前,这些组件是使用单个大文件导入和导出的,例如:
<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"/>
Run Code Online (Sandbox Code Playgroud)
请注意,导入期间组件的顺序是相关的.
现在每个组件都应该占用自己的文件,该文件应该是外部版本的,QA-ed,bla,bla.我们决定导出的输出应该是一个zip文件(包含所有这些文件),我们导入的输入应该是一个类似的zip文件.我们不想在我们的系统中爆炸zip.我们不希望为每个小文件打开单独的流.我目前的问题:
Q1.可以ZipInputStream保证zip条目(小文件)的读取顺序与我们使用的导出插入的顺序相同ZipOutputStream吗?我认为阅读是这样的:
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null)
{
//read from zis until available
}
Run Code Online (Sandbox Code Playgroud)
我知道中央zip目录放在zip文件的末尾但是内部的文件条目有顺序.我也知道依靠订单是一个丑陋的想法,但我只想记住所有的事实.
Q2.如果我使用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));
}
Run Code Online (Sandbox Code Playgroud)
Q3.从同一个ZipFile线程检索的输入流是否安全(例如,我是否可以同时读取不同线程中的不同条目)?任何表现处罚?
谢谢你的回答!
Q1:是的,顺序将与添加条目的顺序相同。
Q2:请注意,由于 zip 存档文件的结构和压缩,没有一个解决方案是完全流式传输的;他们都做了一定程度的缓冲。如果您查看 JDK 源代码,就会发现实现共享大部分代码。尽管索引确实允许查找与条目相对应的块,但对内容内没有真正的随机访问。所以我认为不应该存在有意义的性能差异;特别是操作系统无论如何都会缓存磁盘块。您可能只想测试性能以通过简单的测试用例来验证这一点。
Q3:我不会指望这一点;但很可能他们不是。如果您确实认为并发访问会有所帮助(主要是因为解压缩受 CPU 限制,因此可能会有所帮助),我会尝试读取内存中的整个文件,通过 ByteArrayInputStream 公开,并构造多个独立的读取器。