Эффективный способ чтения небольшого файла из очень большого Zip-файла на Java

#java #zip #zipinputstream

Вопрос:

Мне было интересно, есть ли какой-нибудь эффективный способ прочитать небольшой файл с очень большого почтового индекса. Меня не интересует никакой другой файл в zip, кроме небольшого файла под названием inventory.xml.

Если быть точным, zip-файл находится в artifactory. Поэтому я также не хочу загружать весь файл на свой диск. Вот что у меня есть сейчас.

 URL url = new URL("artifactory-url");  HttpURLConnection con = (HttpURLConnection) url.openConnection();  con.setRequestMethod("GET");  int status = con.getResponseCode();  if (status != 200) {  System.out.println("Unable to find the artifact : "   url.toString());  return bugs;  }  try (ZipInputStream zipStream = new ZipInputStream(con.getInputStream())) {  ZipEntry entry;  while ((entry = zipStream.getNextEntry()) != null) {  if (entry.getName().contains("inventory.xml")) {  //do something here  }   }  }  

Другой вопрос: если бы я знал координаты файла, помогло бы это?

Комментарии:

1. является ли этот код неэффективным ?

2. @DhanasekaranDon он просматривает каждый почтовый индекс, и если это огромный zip-файл с большим количеством записей, это занимает много времени.

3. Ты ничего не можешь с этим поделать. Это последовательный формат. Убедитесь, что вы вышли из цикла после того, как разобрались с нужным файлом.

4. con.getInputStream() получает полный файл, поэтому вы не можете получить только части файла. Так что, как сказал @user207421, вы ничего не можете с этим поделать.

5. @Renis1235 getInputStream() возвращает входной поток. Затем вы должны прочитать из него данные столько, сколько вам нужно. Вы еще не загрузили весь файл целиком. Только ту часть, которую ты прочитал.

Ответ №1:

ZIP-файлы хранят свой каталог в конце файла, поэтому, если у вас есть какой-либо способ случайного доступа к содержимому файла, вы можете это сделать.

Однако это большое «если»: для этого требуется, чтобы Artifactory поддерживал получение диапазона байтов, и вам необходимо повторно реализовать (или найти/адаптировать) код для чтения структуры каталогов и извлечения файла из середины архива.

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

Ответ №2:

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