如何使用java在具有相同密码的目录中解压缩多个pssword受保护的zip文件?

时间:2017-07-08 05:23:39

标签: java passwords integration unzip zip4j

我是java的新手,我正在尝试编写一个java程序来解压缩目录中的所有zip文件,所有这些文件都有相同的密码。 我编写了一个程序,通过提供密码解压缩特定的zip文件。

import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

//import java.util.zip.ZipFile;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.model.FileHeader;

public class Extraction {
     public Extraction() {

     try {

     ZipFile zipFile = new
     ZipFile("C:\\Users\\Desktop\\ZipFile\\myzip.zip");

     if (zipFile.isEncrypted()) {

     zipFile.setPassword("MYPASS!");
     }

     List fileHeaderList = zipFile.getFileHeaders();

     for (int i = 0; i < fileHeaderList.size(); i++) {
     FileHeader fileHeader = (FileHeader) fileHeaderList.get(i);

     zipFile.extractFile(fileHeader, "C:\\Users\\Desktop\\ZipFile");
     System.out.println("Extracted");
     }

     } catch (Exception e) {
     System.out.println("Please Try Again");
     }

     }
        public static void main(String[] args) {
            new Extraction();

        }
}

我还编写了一个代码,用于解压缩文件夹中的所有zip文件(不受密码保护)。

import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

//import java.util.zip.ZipFile;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.model.FileHeader;

public class Extraction {


    public static void main(String[] args) {
        Extraction unzipper = new Extraction();
        unzipper.unzipZipsInDirTo(Paths.get("D:/"), Paths.get("D:/unzipped"));

    }

    public void unzipZipsInDirTo(Path searchDir, Path unzipTo) {

        final PathMatcher matcher = searchDir.getFileSystem().getPathMatcher("glob:**/*.zip");
        try (final Stream<Path> stream = Files.list(searchDir)) {
            stream.filter(matcher::matches).forEach(zipFile -> unzip(zipFile, unzipTo));
        } catch (Exception e) {
            System.out.println("Something went wrong, Please try again!!");
        }
    }

    public void unzip(Path zipFile, Path outputPath) {
        try (ZipInputStream zis = new ZipInputStream(Files.newInputStream(zipFile))) {

            ZipEntry entry = zis.getNextEntry();

            while (entry != null) {

                Path newFilePath = outputPath.resolve(entry.getName());
                if (entry.isDirectory()) {
                    Files.createDirectories(newFilePath);
                } else {
                    if (!Files.exists(newFilePath.getParent())) {
                        Files.createDirectories(newFilePath.getParent());
                    }
                    try (OutputStream bos = Files.newOutputStream(outputPath.resolve(newFilePath))) {
                        byte[] buffer = new byte[Math.toIntExact(entry.getSize())];

                        int location;

                        while ((location = zis.read(buffer)) != -1) {
                            bos.write(buffer, 0, location);
                        }
                    }
                }
                entry = zis.getNextEntry();
            }
        } catch (Exception e1) {
            System.out.println("Please try again");
        }
    }

}

我有点困惑如何整合这两个代码来制作一个程序,该程序解压缩目录中受密码保护并具有相同密码的所有zip文件。 你们中的任何人都可以帮助我整合这两个代码。 我搜索了很多,但没有得到适当的解决方案所以我发布了这个。 我希望我的问题很明确。

1 个答案:

答案 0 :(得分:0)

谢谢你们,虽然没有人回答我的问题。我找到了答案,因为可能有其他人可能正在寻找类似的答案。

import java.io.File;
import java.util.List;

import javax.swing.filechooser.FileNameExtensionFilter;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.model.FileHeader;

public class SamExtraction {

    public static void main(String[] args) {

        final FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter("N/A", "zip");
        //Folder where zip file is present
        final File file = new File("C:/Users/Desktop/ZipFile");
        for (final File child : file.listFiles()) {
            try {
                ZipFile zipFile = new ZipFile(child);
                if (extensionFilter.accept(child)) {
                    if (zipFile.isEncrypted()) {
                        //Your ZIP password
                        zipFile.setPassword("MYPASS!");
                    }
                    List fileHeaderList = zipFile.getFileHeaders();

                    for (int i = 0; i < fileHeaderList.size(); i++) {
                        FileHeader fileHeader = (FileHeader) fileHeaderList.get(i);
                        //Path where you want to Extract
                        zipFile.extractFile(fileHeader, "C:/Users/Desktop/ZipFile");
                        System.out.println("Extracted");
                    }
                }
            } catch (Exception e) {
                System.out.println("Please Try Again");
            }
        }

    }
}