2009-08-04 29 views
5

To może spaść w królestwo "naprawdę niewykonalne" lub "naprawdę nie warte wysiłku", ale tutaj idzie.Dostęp do wieloelementowego pliku gzip (w Javie)

Próbuję uzyskać dostęp do rekordów zapisanych w wieloczęściowym pliku gzip. W szczególności pliki, które mnie interesują, to skompresowane pliki Arc Heretrix. (W przypadku, gdy nie jesteś zaznajomiony z wieloczęściowymi plikami gzip, specyfikacja gzip pozwala na łączenie wielu strumieni gzip w jeden plik gzip, nie udostępniają żadnych informacji słownikowych, jest to proste dołączanie binarne.)

Myślę, że powinno być to możliwe, szukając pewnego przesunięcia w pliku, a następnie skanując bajty nagłówków magii gzip (tj. 0x1f8b, jak w przypadku RFC) i próbując odczytać strumień gzip z następujących bajtów . Problem z tym podejściem polega na tym, że te same bajty mogą pojawić się również w rzeczywistych danych, więc poszukiwanie tych bajtów może prowadzić do nieprawidłowej pozycji, aby rozpocząć odczytywanie strumienia gzip. Czy istnieje lepszy sposób na obsługę dostępu losowego, biorąc pod uwagę, że przesunięcia rekordów nie są znane a priori?

Odpowiedz

1

Projekt GZIP, jak pan sobie uświadomił, nie jest przyjazny przypadkowemu dostępowi.

Możesz zrobić tak, jak opisujesz, a następnie, jeśli napotkasz błąd w dekompresorze, wyciągnij wniosek, że znaleziony podpis był faktycznie skompresowanymi danymi.
Po zakończeniu dekompresji można łatwo zweryfikować poprawność strumienia po dekompresji za pośrednictwem CRC32.

Jeśli pliki nie są tak duże, można rozważyć jedynie dekompresję wszystkich pozycji w serii i zachowanie przesunięć podpisów, aby utworzyć katalog. Podczas dekompresji zrzuć bajty do bitu. W tym momencie wygenerujesz katalog, a następnie będziesz mógł obsługiwać dostęp losowy na podstawie nazwy pliku, daty lub innych metadanych.

To będzie dość szybko dla plików poniżej 100k. Przypuszczam, że gdybyś miał 10 plików po około 100 tys. Sztuk, prawdopodobnie zostałby wykonany w 2s na nowoczesnym procesorze. To właśnie mam na myśli przez "dość szybko". Ale tylko ty znasz perf wymagania twojej aplikacji.

Czy masz klasę GZipInputStream? Jeśli tak, jesteś w połowie drogi.