Распакуйте zip-файл, защищенный паролем, используя Java throws NullPointerException - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно распаковать zip-файл, защищенный паролем.

До сих пор я получил это с помощью Интернета, и я пытаюсь понять код.

но он выбрасывает нулевое исключение и я действительно запутался. это "ребенок" или что-то другое. пожалуйста, объясните.

Исключение в потоке "main" java.lang.NullPointerException в unzip2.Unzip2.main (Unzip2.java:27) C: \ Users \ ZXC \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ исполнитель-сниппеты \ run.xml: 53: Java вернула: 1 BUILD FAILED (общее время: 0 секунд)

там написано, что он в строке 27.

для (конечный дочерний файл: file. ListFiles ()) {

Насколько я знаю, nullpointerexception означает, что моя переменная равна нулю, но я не могу найти, где здесь находится пустое значение и как его исправить

вот мой полный код. пожалуйста, просветите меня.

 /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package unzip2;
    /**
     *
     * @author zxc
     */
    import java.io.File;
    import java.util.List;

    import javax.swing.filechooser.FileNameExtensionFilter;

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

    public class Unzip2 {

        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/zxc/Desktop/ziptest/ziptest2.zip");
            for (final File child : file.listFiles()) {
                try {
                    ZipFile zipFile;
                    zipFile = new ZipFile(child);
                    if (extensionFilter.accept(child)) {
                        if (zipFile.isEncrypted()) {
                            //Your ZIP password
                            zipFile.setPassword("password");
                        }
                        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/zxc/Desktop/zipfile");
                            System.out.println("Extracted");
                        }
                    }
                } catch (ZipException e) {
                    System.out.println("Please Try Again");
                }
            }

        }
    }

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Вам не нужно повторять обработчик файлов. Просто передайте объект file при создании объекта ZipFile.

public class Unzip2 {

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/zxc/Desktop/ziptest/ziptest2.zip");
    //for (final File child : file.listFiles()) {
        try {
            ZipFile zipFile;
            zipFile = new ZipFile(file);
            if (extensionFilter.accept(file)) {
                if (zipFile.isEncrypted()) {
                    //Your ZIP password
                    zipFile.setPassword("password");
                }
                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/zxc/Desktop/zipfile");
                    System.out.println("Extracted");
                }
            }
        } catch (ZipException e) {
            System.out.println("Please Try Again");
        }
    //}

}
0 голосов
/ 14 мая 2018

Простой, давайте взглянем на javadoc :

публичный файл [] listFiles ()

Возвращает массив абстрактных путей, обозначающих файлы в каталоге, обозначенном этим абстрактным путем. Если этот абстрактный путь не обозначает каталог, этот метод возвращает ноль.

Вы дали имя файла и запросили его paths . Файлы не имеют путей. Таким образом, возвращается ноль, и for (whatever : null) приводит к NPE.

Таким образом, реальный смысл здесь: читать документацию, вместо того, чтобы слепо записывать код без понимания того, что этот код должен делать.

0 голосов
/ 14 мая 2018

Ответом является строка над вашим File экземпляром

//Folder where zip file is present
final File file = new File("C:/Users/zxc/Desktop/ziptest/ziptest2.zip");

Вам нужно указать папку, в которой находится ваш zip-файл, а не сам zip-файл

final File file = new File("C:/Users/zxc/Desktop/ziptest");
...