Zip4J API 提供了一种方便的方法来将流式条目添加到 zip 文件:
ZipFile.addStream(InputStream stream, ZipParameters pars)
似乎没有在 ZipFile 或 ZipParameter 类的实例上指定“文件权限”或“默认文件权限”的方法。
默认行为是将条目上的所有文件属性设置为 false,这在 unix 系统上意味着没有所有者、组和其他的读取、写入或执行权限。这很不方便。我想至少为所有者设置读取权限标志。
是否有一种方法可以设置“流式”zip 文件条目的文件权限(即使用 ZipFile.addStream 方法添加的文件权限?
如果不是(1)是否有办法在创建条目后添加文件权限(实际上存储在磁盘上的基础 zip 文件中 - 请参阅有关此警告的其他信息)?
附加信息
请注意,一旦将流条目添加到 Zip 文件,就可以从其标题数据中获取和设置文件属性信息,这可以使用 ZipFile.getHeader(entryName) 方法获得。但是,使用此 API 设置文件权限值不会直接影响基础 zip 文件。此外,似乎无法将更新的标头信息保存到磁盘(尽管我可能会遗漏一些东西)。
作为参考,获取和设置文件属性的方法是:
byte[] FileHeader.getInternalFileAttributes()
void FileHeader.setInternalFileAttributes(byte[] attributes)
byte[] FileHeader.getExternalFileAttributes()
void FileHeader.setExternalFileAttributes(byte[] attributes)
深入研究 zip4j 代码,表明这些文件属性存储在一个 4 字节数组中,其中字节 2 和 3(从字节 0 开始)中的位表示 unix 文件权限位。这可以在 net.lingala.zip4j.util.FileUtils 类的应用 posix 文件属性中找到。
潜在的解决方法(我试图避免)
我可以看到的一种解决方法是将流中的数据写入临时文件,确保该文件具有所需的权限,将文件添加到 zip 存档中,然后删除临时文件(因为它已达到其目的)。这种方法假设磁盘文件权限得到正确维护,在“posix 系统”上似乎就是这种情况。
我宁愿不使用这种方法。