Невозможно прочитать файлы из потока ввода файлов ZIP - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть Zip-файл, который я пытаюсь прочитать. Я не хочу использовать ZipFile, потому что в будущем я хотел бы сделать это для данных, которые не из файла.

Это то, что я пробовал до сих пор. Вместо того, чтобы печатать содержимое res00000.dat, он печатает пустую строку. Я не знаю, как это исправить

ZipInputStream zipInputStream = new ZipInputStream(inputStream);
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
    if (!zipEntry.getName().equals("res00000.dat")) {
        zipInputStream.closeEntry();
        continue;
    }
}
int len;
ByteArrayOutputStream byteArrayOutputStream = new ByterrayOutputStream();
byte[] buffer = new byte[1024];
while ((len = zipInputStream.read(buffer)) > 0) {
    byteArrayOutputStream.write(buffer, 0, len);
}
String xml = byteArrayOutputStream.toString();
System.out.println(xml);
zipInputStream.closeEntry();
zipInputStream.close();
return null;

В моем ZIP-файле всего два файла. Это файл банка Blackboard Test, который я пытаюсь проанализировать:

Zip file
+-imsmanifest.xml
+-res00000.dat

Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 07 ноября 2018

Ваш код в настоящее время не обрабатывает пропущенную запись. Он просто тихо прокручивается до конца ZipInputStream, поэтому нет никакого способа узнать, что происходит. Вы можете сделать следующее, чтобы получить исключение, когда отсутствует запись, идентифицируемая по имени:

public String readEntry(ZipInputStream in, String name) {
  while ((zipEntry = in.getNextEntry()) != null) {
    if (zipEntry.getName().equals(name)) {
      return readXml(zipInputStream);
    }
  }
  throw new IllegalStateException(name + " not found inside ZIP");
}

Вы, скорее всего, будете наблюдать выше IllegalStateException сейчас за пропуском res00000.dat.

Обратите внимание, что нет необходимости вызывать closeEntry() вручную при прокрутке ZipInputStream, поскольку getNextEntry() уже делает это под колпаком. Исходный код JDK 11:

public ZipEntry getNextEntry() throws IOException {
    ensureOpen();
    if (entry != null) {
        closeEntry();
    }
    ...
...