使用JDK 5 api从zip文件中提取时保持文件权限

我正在使用java.util.Zip和java.util.ZipEntry成功地将zip文件的内容添加到磁盘。 我想在* nix文件系统上提取时保持设置的文件权限。

任何人都可以指出我这样做的“正确”方法吗?

基本上,你不能在Zip / Jar文件中存储(unix)文件权限,因此在提取你的jar时你不能保留它们(它们在创建jar时就丢​​失了)。 看到这个问题: 创建一个jar文件 – 保留文件权限

如果您需要保存在归档中的文件权限并在解压缩时进行恢复,则需要考虑替代.tar或.tar.gz / .tar.bz2格式,这也是大多数Java构建工具本身支持的(Ant,Gradle, Maven的…)

我认为实际上无法正确保留权限。

权限是非常特定于操作系统的:虽然POSIX文件权限允许用户设置是否可以为文件所有者,组和其他人读取,写入或执行文件,但NTFS文件系统具有类似的系统但执行权限的概念是不耐烦的。 而早期的FAT / FAT32文件系统,根本没有文件权限(一部分来自只读属性)。

作为跨平台,java很难根据底层操作系统在新创建的(解压缩)文件上正确设置权限….

也就是说,Java 6有一个新的java.io.File类 ,它允许你设置权限(使用setExecutable(),setReadable()等方法……)

这些对我帮助很大,尤其是setExecutable(),这是我在Linux文件系统上解压缩可执行文件时的主要关注点。 而且你不必费心去弄清楚你在运行什么操作系统,因为如果在没有可执行文件概念的情况下在Windows或其他系统下运行,该方法将无所事事。

查看Apache Commons Compress并查看TarArchiveEntry,它应该像您希望的那样保留文件权限。

TarArchiveEntry entry = tarInput.getNextTarEntry(); 

这是javadocs 。 我想我已经把Commons疯了……