问题描述
一个文件在两个压缩包下面怎么读取啊?如:E:\001.zip\111.zip,001压缩包里有一个111压缩包,不解压读取111压缩包的里文件,能读取里面的文件名就行,求大神帮忙!谢谢!
解决方案
解决方案二:
以前一个存档的bug讨论中提到,JRE不支持这种操作,因为读取一个zip文件有随机访问的要求(不是流式文件访问),在嵌入式的流中做不到随机访问,因此不支持,需要我们明确地解压到临时文件中或内存中。https://community.oracle.com/thread/2265518?start=0&tstart=0
解决方案三:
ZIP文件压缩时,需要有一部分关于文件信息的头和它的内容开始处所在的偏移量及内容长度的记录在前面,访问中需要随机访问(类似RandomAccessFile那种随时移动读取位置的指针,不是按顺序读取),就像我们在ZipFile介绍中先迭代找到ZipEntry然后对每一个ZipEntry去找到它的ZipFileInputStream一样,对于多数压缩文件格式都是这么做的,在某一部分记录着文件原始信息另一部分是内容,中间需要随机访问。比如WinRAR的固实压缩就是想办法把记录文件信息的地方紧凑地合并在一起,然后,把文件内容完全一个一个地接在一起合并压缩,因此它的压缩率更高,非常适合像打包Eclipse这种小文件个数非常多但大小都很小的文件(比如文件数量多的压缩都可以考虑WinRAR固实压缩,当然如果文件主要是JPG这种已经压缩的格式就不用再选择高压缩率的压缩方式了,因为大小跟不压缩没有什么分别),另外固实压缩的方式也决定了只要其中一个文件损坏整个文件中就没有一个能正常地还原出来(不像普通压缩某个文件坏了其它的部分还是可以还原的)。引用1楼humanity的回复:
以前一个存档的bug讨论中提到,JRE不支持这种操作,因为读取一个zip文件有随机访问的要求(不是流式文件访问),在嵌入式的流中做不到随机访问,因此不支持,需要我们明确地解压到临时文件中或内存中。https://community.oracle.com/thread/2265518?start=0&tstart=0
解决方案四:
谢谢您的回复,那么apache是不是有一个包可以实现这个功能啊?ant包引用2楼humanity的回复:
ZIP文件压缩时,需要有一部分关于文件信息的头和它的内容开始处所在的偏移量及内容长度的记录在前面,访问中需要随机访问(类似RandomAccessFile那种随时移动读取位置的指针,不是按顺序读取),就像我们在ZipFile介绍中先迭代找到ZipEntry然后对每一个ZipEntry去找到它的ZipFileInputStream一样,对于多数压缩文件格式都是这么做的,在某一部分记录着文件原始信息另一部分是内容,中间需要随机访问。比如WinRAR的固实压缩就是想办法把记录文件信息的地方紧凑地合并在一起,然后,把文件内容完全一个一个地接在一起合并压缩,因此它的压缩率更高,非常适合像打包Eclipse这种小文件个数非常多但大小都很小的文件(比如文件数量多的压缩都可以考虑WinRAR固实压缩,当然如果文件主要是JPG这种已经压缩的格式就不用再选择高压缩率的压缩方式了,因为大小跟不压缩没有什么分别),另外固实压缩的方式也决定了只要其中一个文件损坏整个文件中就没有一个能正常地还原出来(不像普通压缩某个文件坏了其它的部分还是可以还原的)。Quote: 引用1楼humanity的回复:
以前一个存档的bug讨论中提到,JRE不支持这种操作,因为读取一个zip文件有随机访问的要求(不是流式文件访问),在嵌入式的流中做不到随机访问,因此不支持,需要我们明确地解压到临时文件中或内存中。https://community.oracle.com/thread/2265518?start=0&tstart=0
解决方案五:
没听说,不清楚。如果它有这功能可能是自己实现的native方法,JRE自带的那个native的zip读写功能是不支持的。
解决方案六:
谢谢了引用4楼humanity的回复:
没听说,不清楚。如果它有这功能可能是自己实现的native方法,JRE自带的那个native的zip读写功能是不支持的。