Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android上从ZipArchiveInputStream解压符号链接_Java_Android_Symlink_Unzip - Fatal编程技术网

Java 在Android上从ZipArchiveInputStream解压符号链接

Java 在Android上从ZipArchiveInputStream解压符号链接,java,android,symlink,unzip,Java,Android,Symlink,Unzip,我很难使用ApacheCommons-compress-1.6库从Android上的zip存档中解压缩符号链接 当我获取ZipArchiveEntry时,有一个名为isUnixSymlink()的方法,它告诉我文件是否是符号链接,但它总是返回false InputStream inputStream = new FileInputStream(archive); ZipArchiveInputStream zipInputStream = new ZipArchiveInputStream(in

我很难使用ApacheCommons-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();
我阅读了这里的文档:,他们在“4.5可扩展数据字段”一章中讨论附加信息。临时演员应该开始了

头id为2个字节(在我的例子中应该是“0x000d UNIX”

数据大小为2字节

但是前两个字节总是[85,84],在我得到字节数组[9,0]之后

也许这就是ZipArchiveEntry无法返回良好布尔值的原因。 有人能给我解释一下那个案子吗


提前感谢。

好的,我找到了在解压源文件中查找zip文件额外数据的正确方法…没有找到任何文档(如果有人找到了,请向我们发送链接)

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

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


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

我也遇到了同样的问题。结果,
ZipArchiveInputStream
附带了以下警告(我的重点):

当从文件中读取时,该类是首选的,因为在返回条目之前无法读取中心目录头。特别是ZipArchiveInputStream

  • 可能返回的条目根本不属于中央目录,也不应被视为归档的一部分
  • 可以返回多个同名条目
  • 不会返回内部或外部属性。
  • 可能返回不完整的额外字段数据
  • 如果存档使用数据描述符功能,则在到达下一个条目之前,可能会返回未知的条目大小和CRC值

当这个问题特别问到关于
ZipArchiveInputStream
时,我想我会告诉大家,切换到
ZipFile
解决了我的问题。

再解释一下你的用例——你打算如何准确地存档一个符号链接?你是想存储链接本身,还是它指向的内容?@TomG:我会的他希望将符号链接本身存档,因为存储它指向的内容与存储常规文件没有什么不同,标志也没有任何用处。我正在尝试提取存储在zip存档中的符号链接。目前,该文件已创建,其内容包含链接到的文件的名称。但它不是一个文件symlink.我看不到对
isUnixSymlink()的任何引用
在Android文档中。您使用的是外部库吗?如果是,最好明确地说出来。还要注意,如果您打算将存档内容提取到SD卡上,您将无法创建符号链接,因为FAT32不支持这些。很抱歉,我使用的是apache commons-compress-1.6库,它在ZipArchiveEntry类中提供了方法isUnixSymlink。Android还提供了ZipUnarchiver类(ZipInputStream、ZipEntry),但是ZipEntry类没有方法isUnixSymlink。但是,当它来自apache压缩库和Android unarchiver类时,额外的字节数组是相同的,所以我仍然存在这个问题。正如我所知,Android设备文件系统与ext3/ext4一样是unix的,所以也可以创建符号链接。