Если myInputStream
вы работаете с помощью реального файла на диске, то вы можете просто использовать java.util.zip.ZipFile
вместо этого, который поддерживается RandomAccessFile
и обеспечивает прямой доступ к записям zip по имени. Но если все, что у вас есть, это InputStream
(например, если вы обрабатываете поток непосредственно при получении из сетевого сокета или аналогичного), вам придется выполнять свою собственную буферизацию.
Вы можете скопировать поток во временный файл, затем открыть этот файл с помощью ZipFile
или если вы заранее знаете максимальный размер данных (например, для HTTP-запроса, который объявляет егоспереди), вы можете использовать BufferedInputStream
, чтобы сохранить его в памяти до тех пор, пока вы не найдете требуемую запись.
BufferedInputStream bufIn = new BufferedInputStream(myInputStream);
bufIn.mark(contentLength);
ZipInputStream zipIn = new ZipInputStream(bufIn);
boolean foundSpecial = false;
while ((entry = zin.getNextEntry()) != null) {
if("special.txt".equals(entry.getName())) {
// do whatever you need with the special entry
foundSpecial = true;
break;
}
}
if(foundSpecial) {
// rewind
bufIn.reset();
zipIn = new ZipInputStream(bufIn);
// ....
}
(я не проверял этот код сам, вы можете обнаружить, что необходимо использовать что-то вроде Викисклада гипергликемии CloseShieldInputStream
в период между bufIn
и первым zipIn
, чтобы первый поток молнии, чтобы закрыть без закрытия базовый bufIn
, прежде чем перематывать его).
Я не понимаю ... Итерируйте записи, пока не получите тот, который вы хотите, а затем обработайте его? –
Сначала перейдите к файлу и сохраните его так, как вы хотите. Затем просто повторите попытку. – Bubletan
Существует также ZipFile (java <7) и Zip-файловая система, начиная с Java7 (хотя это невозможно из ZipInputStream :)), поэтому это не ответ на вопрос – GPI