так что в основном это то, что я извлекаю файл .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».