Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 无法从Mac中的zip archieve提取可执行文件_Java_Macos_Unzip - Fatal编程技术网

Java 无法从Mac中的zip archieve提取可执行文件

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 =

我想从zip archieve中提取Unix可执行文件。它在Windows上正常工作,但在Mac上不工作。我的代码下载zip文件并将其解压缩到特定位置。它确实提取文件,但该文件是可执行文件,它将其提取为文本编辑文档。当我手动提取它时,我得到了可执行文件。我应该强制还是有任何权限?提前谢谢

这是我的解压功能:

    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
都会验证文件是相同的(因此您的代码按预期工作)。很高兴它现在对你有用。