我对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"/>
请注意,导入期间组件的顺序是相关的。
现在,每个组件都应占用其自己的文件,该文件应进行 外部
版本控制(质量检查),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
}
我知道中央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));
}
Q3。从同一个ZipFile
线程检索的输入流是否安全(例如,我可以同时读取不同线程中的不同条目)吗?有任何性能损失吗?
感谢您的回答!
问题1:是的,顺序与添加条目的顺序相同。
问题2:请注意,由于zip存档文件的结构以及压缩的原因,没有一种解决方案是完全流式传输的;它们都进行某种程度的缓冲。而且,如果您查看JDK源代码,则实现共享大多数代码。尽管索引确实允许查找与条目相对应的块,但是对内容内部没有真正的随机访问。因此,我认为应该没有有意义的性能差异;尤其是因为OS仍会对磁盘块进行缓存。您可能只想测试性能以通过一个简单的测试用例进行验证。
问题3:我不会指望这一点。而且很可能不是。如果您真的认为并发访问会有所帮助(主要是因为解压缩受CPU限制,那么它可能会有所帮助),那么我将尝试读取内存中的整个文件,通过ByteArrayInputStream公开,并构造多个独立的读取器。
介绍 (Introduction) java.util.zip.ZipInputStream类实现了一个输入流过滤器,用于读取ZIP文件格式的文件。 包括对压缩和未压缩条目的支持。 类声明 以下是java.util.zip.ZipInputStream类的声明 - public class ZipInputStream extends InflaterInputStream 字段 (Fie
主要内容:面向读者,前提条件,问题反馈包提供了用于读写标准ZIP和GZIP文件格式的类。还包括使用ZIP和GZIP文件格式,使用默认压缩算法来压缩和解压缩数据的类。 此外,还有用于计算任意输入流的CRC-32和Adler-32校验和的实用程序类。 本教程将演示如何使用包中提供的简单且实用的方法。 面向读者 这个教程是为初学者准备,以帮助他们理解有关包中所有可用方法相关的基本功能。 前提条件 在开始练习本参考文献中给出的各种类型的示例之
java.util.zip 包提供了用于读取和写入标准 ZIP 和 GZIP 文件格式的类。 还包括使用 DEFLATE 压缩算法压缩和解压缩数据的类,该算法由 ZIP 和 GZIP 文件格式使用。
没有用呢,中文的文件、文件夹仍会报错(malformed input off : 1, length : 1)。 这里都有注释的嘛,为什么会这样?
问题内容: 我有将ZipInputSream转换为byte []的代码,但我不知道如何将其转换为inputstream。 问题答案: 这是我解决此问题的方法。现在,我可以将单个文件从ZipInputStream作为InputStream传输到内存。
我还尝试使用而不是提取ZIP归档,但随后出现以下错误: ZIP文件没有问题,我已经在Mac OSX上用测试了它。我还尝试使用ZIP版本3.0和2.1(最初是2.0)重新压缩它。我可以在Mac OSx上解压所有版本而没有任何问题(使用Unarchiver和Archive实用程序)。 这快把我逼疯了,可能会有什么错? 我在解压压缩文件之前从服务器下载这些压缩文件,显然我忘记在开始解压操作之前调用下载操