Jeśli myInputStream
pracujesz Pochodzi z prawdziwego pliku na dysku, więc możesz po prostu użyć java.util.zip.ZipFile
, który jest wspierany przez RandomAccessFile
i zapewnia bezpośredni dostęp do wpisów zip po nazwie. Ale jeśli wszystko, co masz, to InputStream
(np. Jeśli przetwarzasz strumień bezpośrednio na odbiorze z gniazda sieciowego lub podobnego), musisz wykonać własne buforowanie.
Można skopiować strumień do pliku tymczasowego, a następnie otworzyć ten plik za pomocą ZipFile
, lub jeśli znasz maksymalny rozmiar danych z wyprzedzeniem (np żądania HTTP, który deklaruje Content-Length
z góry) można użyć BufferedInputStream
, aby buforować go w pamięci, dopóki nie znajdziesz wymaganego wpisu.
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);
// ....
}
(nie mam sobie przetestowane tego kodu, może się okazać, że to niezbędne do korzystania z czegoś podobnego do świetlicy-IO CloseShieldInputStream
w między bufIn
i pierwszym zipIn
, aby umożliwić pierwszy strumień zip, aby zamknąć bez zamykania podstawowy bufIn
, zanim go przewiniesz).
Nie rozumiem ... Iteruj wpisy, dopóki nie uzyskasz tego, którego chcesz, a następnie przetworzę? –
Najpierw przejdź do pliku i zapisz go tak, jak chcesz. Następnie powtórz ponownie. – Bubletan
Istnieje również ZipFile (java <7) i system plików Zip zaczynający się od Java7 (chociaż nie jest to możliwe z ZipInputStream :)), dlatego nie jest to odpowiedź na pytanie – GPI