Я пытаюсь прочитать извлечение данного файла из ZIP-файла. Zip-файл также содержит каталоги и подкаталоги. Я пробовал apis файла nio Java7, но поскольку в моем zip-архиве есть подкаталоги, мне нужно указать полный путь для извлечения файла, что не подходит в моем сценарии. Поскольку мне нужно получить от пользователя ввод, извлеченный из файла. Я пытался выполнить код ниже, но каким-то образом читал метод ZipInputStream, не читая содержимое в буфер. При отладке я обнаружил, что значение объекта ZipEntry равно нулю внутри ZipInputStream, поскольку его метод чтения просто возвращает -1, но теперь я застрял, так как не могу понять, как это значение устанавливается для него.
try(OutputStream out=new FileOutputStream("filetoExtract");) {
zipFile = new ZipFile("zipFile");
Enumeration<? extends ZipEntry> e = zipFile.entries();
while (e.hasMoreElements()) {
ZipEntry entry = e.nextElement();
if (!entry.isDirectory()) {
String entryName = entry.getName();
String fileName = entryName.substring(entryName.lastIndexOf("/") + 1);
System.out.println(i++ + "." + entryName);
if (searchFile.equalsIgnoreCase(fileName)) {
System.out.println("File Found");
BufferedInputStream bufferedInputStream = new BufferedInputStream(zipFile.getInputStream(entry));
ZipInputStream zin = new ZipInputStream(bufferedInputStream);
byte[] buffer = new byte[9000];
int len;
while ((len = zin.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.close();
break;
}
}
}
} catch (IOException ioe) {
System.out.println("Error opening zip file" + ioe);
}
Пожалуйста, посоветуйте, что я здесь делаю не так. Спасибо
РЕДАКТИРОВАТЬ: После небольшой отладки я обнаружил, что класс ZipFile имеет внутренний класс с похожим именем (ZipFileInputStream). Таким образом, он создавал его объект, а не внешний класс ZipFileInputStream. Итак, я попробовал код ниже, и это сработало. Но я не совсем понимаю, что произошло. Если бы кто-нибудь мог мне помочь, логи c за кулисами было бы действительно здорово.
// BufferedInputStream bufferedInputStream = new
//BufferedInputStream(zipFile.getInputStream(entry));
//ZipInputStream zin = new ZipInputStream(bufferedInputStream);
InputStream zin= zipFile.getInputStream(entry);