#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:
Как многие из вас упоминали, код, упомянутый в самом вопросе, вероятно, является наиболее эффективным решением. В любом случае, спасибо вам за помощь.