Java 在Windows中创建Zip文件,在Linux中解压缩Zip文件

Java 在Windows中创建Zip文件,在Linux中解压缩Zip文件,java,Java,我在Windows下创建了一个zip文件(连同目录),如下所示(代码取自): “MyDirectory\MyFile.txt”而不是MyFile.txt放在文件夹MyDirectory下。 我试图通过将zip文件创建代码更改为 String[] filenames = new String[]{"MyDirectory" + "/" + "MyFile.txt"}; 但是,通过硬编码分隔符,这是一个合格的解决方案吗?它能在Mac操作系统下工作吗?(我没有Mac电脑可供试用)是的,您的解

我在Windows下创建了一个zip文件(连同目录),如下所示(代码取自):

“MyDirectory\MyFile.txt”而不是MyFile.txt放在文件夹MyDirectory下。

我试图通过将zip文件创建代码更改为

    String[] filenames = new String[]{"MyDirectory" + "/" + "MyFile.txt"};
但是,通过硬编码分隔符,这是一个合格的解决方案吗?它能在Mac操作系统下工作吗?(我没有Mac电脑可供试用)

是的,您的解决方案(尽管显然不雅观)是正确的。 “/”应该在zipentry内部使用,而不是本地File.separator

public static boolean extractZipFile(File zipFilePath, boolean overwrite) {
    InputStream inputStream = null;
    ZipInputStream zipInputStream = null;
    boolean status = true;

    try {
        inputStream = new FileInputStream(zipFilePath);

        zipInputStream = new ZipInputStream(inputStream);
        final byte[] data = new byte[1024];

        while (true) {
            ZipEntry zipEntry = null;
            FileOutputStream outputStream = null;

            try {
                zipEntry = zipInputStream.getNextEntry();

                if (zipEntry == null) break;

                final String destination = Utils.getUserDataDirectory() + zipEntry.getName();

                if (overwrite == false) {
                    if (Utils.isFileOrDirectoryExist(destination)) continue;
                }

                if (zipEntry.isDirectory())
                {
                    Utils.createCompleteDirectoryHierarchyIfDoesNotExist(destination);
                }
                else
                {
                    final File file = new File(destination);
                    // Ensure directory is there before we write the file.
                    Utils.createCompleteDirectoryHierarchyIfDoesNotExist(file.getParentFile());

                    int size = zipInputStream.read(data);

                    if (size > 0) {
                        outputStream = new FileOutputStream(destination);

                        do {
                            outputStream.write(data, 0, size);
                            size = zipInputStream.read(data);
                        } while(size >= 0);
                    }
                }
            }
            catch (IOException exp) {
                log.error(null, exp);
                status = false;
                break;
            }
            finally {
                if (outputStream != null) {
                    try {
                        outputStream.close();
                    }
                    catch (IOException exp) {
                        log.error(null, exp);
                        break;
                    }
                }

                if (zipInputStream != null) {
                    try {
                        zipInputStream.closeEntry();
                    }
                    catch (IOException exp) {
                        log.error(null, exp);
                        break;
                    }
                }
            }

        }   // while(true)
    }
    catch (IOException exp) {
        log.error(null, exp);
        status = false;
    }
    finally {
        if (zipInputStream != null) {
            try {
                zipInputStream.close();
            } catch (IOException ex) {
                log.error(null, ex);
            }
        }

        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException ex) {
                log.error(null, ex);
            }
        }
    }
    return status;
}
    String[] filenames = new String[]{"MyDirectory" + "/" + "MyFile.txt"};