从Android上的ZipArchiveInputStream解压缩符号链接

时间:2013-11-26 14:47:23

标签: java android symlink unzip

我在使用apache commons-compress-1.6库从Android上的zip存档解压缩符号链接时遇到了麻烦。

当我得到ZipArchiveEntry时,有一个名为isUnixSymlink()的方法,它告诉该文件是否是符号链接,但它总是返回false。

InputStream inputStream = new FileInputStream(archive);
ZipArchiveInputStream zipInputStream = new ZipArchiveInputStream(inputStream);
ZipArchiveEntry ze = null;

while ((ze = zipInputStream.getNextZipEntry()) != null) {
    File path = new File("/tmp/user/folder", ze.getName());
    byte[] extras = ze.getExtra();
    boolean isSymlink = ze.isUnixSymlink();

我阅读了这里的文档:http://www.pkware.com/documents/casestudies/APPNOTE.TXT,他们正在讨论“4.5可扩展数据字段”一章中的额外信息。额外应该开始

头标识为2个字节(在我的情况下应为“0x000d UNIX”

和2个字节的数据大小

但是两个第一个字节总是[85,84],并且在我有字节数组[9,0]之后。

也许这就是为什么ZipArchiveEntry无法返回好的布尔值。 有人可以就此案给我一些解释吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

好的,我发现在解压缩源文件中找到zip文件额外数据的正确方法...没有找到任何文档(如果有人,请发给我们一个链接)

两个第一个字节数组是一个通用时间戳。接下来的两个字节数组是下一个数据的大小,其中包含pkware数据作为访问时间,修改时间为eso。

接下来的两个字节数组也是标题id,接下来的两个是数据大小,最后一个字节是额外的信息。

但是即使我解释它们,甚至java代码都在Unix文件系统上运行,我也没有得到关于该文件的任何信息是符号链接。

答案 1 :(得分:0)

我遇到了同样的问题。事实证明,ZipArchiveInputStream附带以下警告(强调我的):

  

从文件读取时首选ZipFile类,因为ZipArchiveInputStream因返回条目前无法读取中央目录标题而受到限制。特别是ZipArchiveInputStream

     
      
  • 可能会返回完全不属于中心目录的条目,并且不应被视为归档的一部分。
  •   
  • 可能会返回多个具有相同名称的条目。
  •   
  • 不会返回内部或外部属性。
  •   
  • 可能会返回不完整的额外字段数据。
  •   如果存档使用数据描述符功能,
  • 可能会为条目返回未知大小和CRC值,直到达到下一个条目。
  •   

虽然问题明确询问ZipArchiveInputStream,但我想我会分享转换为ZipFile为我解决问题。