использование Java для распаковки файла в каталог - PullRequest
0 голосов
/ 13 сентября 2018

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

хорошо, так:

package com.supercas240.RaidEvents.Main;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

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 {
        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();
    }
}

- это мой класс настройки для извлечения файла. в настоящее время для тестирования, в основном классе я называю этот класс по:

public class Main extends JavaPlugin implements Listener {


public String zipFilePath = this.getServer().getWorldContainer().getAbsolutePath() + "\\plugins\\RaidEvents\\world_RaidEvents.zip";
public String destDirectory = this.getServer().getWorldContainer().getAbsolutePath();

UnzipUtility unzip = new UnzipUtility();

public void onEnable() {



    try {
        unzip.unzip(zipFilePath, destDirectory);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

прежде чем я объясню свою ошибку, просто покажите:

ошибка

так что код в основном делает: он получает каталог назначения, если он не существует, он делает его:

File destDir = new File(destDirectory);
    if (!destDir.exists()) {
        destDir.mkdir();
    }

затем он начинает повторять все файлы в .zip, и, если это каталог, он создает его, если это файл, который он копирует:

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();
    }

кажется, это сработало бы, не так ли? Тем не менее, если мы посмотрим на ошибку, кажется, что она не создает каталоги, когда она проходит через них, и когда она достигает villagers.dat, она не может найти каталог, в который ее помещают? Я немного растерялся на этом этапе. каталог zip-файла правильный, он называется «world_RaidEvents.zip».

...