Как распаковать и не создавать подкаталог при его распаковке - PullRequest
0 голосов
/ 15 апреля 2020

Это класс UnzipUtility, используемый для извлечения zip-файла, проблема, с которой я сталкиваюсь, заключается в том, что когда я извлекаю zip-файл, у меня все еще есть разархивированная папка с его содержимым, мне нужно будет извлечь его, пропуская уровень и сразу его содержимое.

public class UnzipUtility {
/**
 * Size of the buffer to read/write data
 */
private static final int BUFFER_SIZE = 4096;
/**
 * Extracts a zip file specified by the zipFilePath to a directory specified by
 * destDirectory (will be created if does not exists)
 * @param zipFilePath
 * @param destDirectory
 * @throws IOException
 */
public void unzip(String zipFilePath, String destDirectory) throws IOException {
    File destDir = new File(destDirectory);
    if (!destDir.exists()) {
        destDir.mkdir();
    }
    ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
    ZipEntry entry = zipIn.getNextEntry();
    // iterates over entries in the zip file
    while (entry != null) {
        String filePath = destDirectory + File.separator + entry.getName();
        if (!entry.isDirectory()) {
            // if the entry is a file, extracts it
            extractFile(zipIn, filePath);
        } else {
            // if the entry is a directory, make the directory
            File dir = new File(filePath);
            dir.mkdir();
        }
        zipIn.closeEntry();
        entry = zipIn.getNextEntry();
    }
    zipIn.close();
}

/**
 * Extracts a zip entry (file entry)
 * @param zipIn
 * @param filePath
 * @throws IOException
 */
private void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
    if(Files.notExists(new File(filePath).getParentFile().toPath())) {
        new File(filePath).getParentFile().mkdir();
    }
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
    byte[] bytesIn = new byte[BUFFER_SIZE];
    int read = 0;
    while ((read = zipIn.read(bytesIn)) != -1) {
        bos.write(bytesIn, 0, read);
    }
    bos.close();
}

}

1 Ответ

0 голосов
/ 23 апреля 2020

Я реализовал решение проблемы, просто добавив третий параметр, чтобы указать каталог в zip, где должен быть root извлечения, таким образом мы извлекаем содержимое zip-файла без его родительской папки.

public class UnzipUtility {
/**
 * Size of the buffer to read/write data
 */
private static final int BUFFER_SIZE = 4096;

/**
 * Extracts a zip file specified by the zipFilePath to a directory specified by
 * destDirectory (will be created if does not exists)
 */
public void unzip(String zipFilePath, String destDirectory, String rootLevelDir) throws IOException {

    if(rootLevelDir == null || rootLevelDir.isEmpty()){
        rootLevelDir="/";
    }
    File destDir = new File(destDirectory);
    if (!destDir.exists()) {
        destDir.mkdirs();
    }
    try(ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath))) {
        ZipEntry entry = zipIn.getNextEntry();
        // iterates over entries in the zip file
        while (entry != null) {
            String filePath = destDirectory + File.separator + entry.getName();
            if ( rootLevelDir.equals("/") || entry.getName().startsWith(rootLevelDir)) {

                if (!rootLevelDir.equals("/")) {
                    filePath = filePath.replaceFirst(rootLevelDir, "");
                }
                if (!entry.isDirectory()) {
                    // if the entry is a file, extracts it
                    extractFile(zipIn, filePath);
                } else {
                    // if the entry is a directory, make the directory
                    File dir = new File(filePath);
                    dir.mkdirs();
                }
            }
            zipIn.closeEntry();
            entry = zipIn.getNextEntry();
        }
    }
}

/**
 * Extracts a zip entry (file entry)
 */
private void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
    if (Files.notExists(new File(filePath).getParentFile().toPath())) {
        new File(filePath).getParentFile().mkdirs();
    }
    try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath))) {
        byte[] bytesIn = new byte[BUFFER_SIZE];
        int read;
        while ((read = zipIn.read(bytesIn)) != -1) {
            bos.write(bytesIn, 0, read);
        }
    }
}

}

...