Java 无法从Mac中的zip archieve提取可执行文件
我想从zip archieve中提取Unix可执行文件。它在Windows上正常工作,但在Mac上不工作。我的代码下载zip文件并将其解压缩到特定位置。它确实提取文件,但该文件是可执行文件,它将其提取为文本编辑文档。当我手动提取它时,我得到了可执行文件。我应该强制还是有任何权限?提前谢谢 这是我的解压功能:Java 无法从Mac中的zip archieve提取可执行文件,java,macos,unzip,Java,Macos,Unzip,我想从zip archieve中提取Unix可执行文件。它在Windows上正常工作,但在Mac上不工作。我的代码下载zip文件并将其解压缩到特定位置。它确实提取文件,但该文件是可执行文件,它将其提取为文本编辑文档。当我手动提取它时,我得到了可执行文件。我应该强制还是有任何权限?提前谢谢 这是我的解压功能: public void decompress(String zipFilePath, String extractedFilePath) { byte[] buffer =
public void decompress(String zipFilePath, String extractedFilePath) {
byte[] buffer = new byte[1024];
try {
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(extractedFilePath.toString()));
ZipEntry ze = zipInputStream.getNextEntry();
while (ze != null) {
String filename = ze.getName();
File newFile = new File(zipFilePath +_config.configProperties().getPathSeparator()+ filename + _config.configProperties().getVersion());
FileOutputStream fos = new FileOutputStream(newFile);
int len;
while ((len = zipInputStream.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
ze = zipInputStream.getNextEntry();
}
zipInputStream.closeEntry();
zipInputStream.close();
}catch (IOException ex){
ex.printStackTrace();
}
}
默认情况下,Mac不知道如何处理
.exe
文件,除非您的系统上有Windows虚拟机(在这种情况下,双击虚拟机将打开.exe
文件)。该文件可能完全是用您的代码提取的(这很可能),但如果它有.exe
扩展名或根本没有扩展名,那么它将默认为文本编辑文档,因为Mac不知道如何处理它
您可以在压缩前后验证文件的SHA1校验和,以确保它们相同
你的mac:demo$shasum manual\u extraction.bin
mac:demo$shasum code\u extracted\u version.bin
对于手动提取的版本(完美的版本)和代码提取的版本(损坏的版本),从终端在Mac上查看以下命令的结果会很有趣:
你的mac电脑:演示$xxd手动提取.bin|head
你的mac电脑:演示$xxd代码提取版。bin|head
我注意到,
extractedFilePath
参数作为String
传入,但是我在ZipInputStream()
中找到了解决方案,仍然调用extractedFilePath.toString()
Runtime.getRuntime().exec("chmod u+x " + filepath);
当我把它放到我的代码块中时,它工作了。正如我先前猜测的,它需要这个权限。谢谢大家 哪种类型的可执行文件?那扩展呢?我想要的是Unix可执行文件,正如我说的,我可以通过手动提取来获得它,但是代码给了我文档。你能发布不同版本的大小差异吗?而且
xxd manual.bin|head
和xxd codevrion.bin|head
的输出没有大小差异。但我无法理解第二件事。你能更明确一点吗?只要你不为你创建的文件设置可执行标志x
,它将作为普通文件处理。谢谢你的评论。我忘了说,文件类型是Unix可执行文件。用命令更新了我的答案,以获得(来自xxd
和shasum
)Ah的输出。我们正要讨论权限问题,因为shasum
和xxd
都会验证文件是相同的(因此您的代码按预期工作)。很高兴它现在对你有用。