Дизайн GZIP, как вы поняли, не подходит для произвольного доступа.
Вы можете сделать, как вы описали, и затем, если вы столкнетесь с ошибкой в декомпрессоре, придите к выводу, что найденная вами подпись была фактически сжатыми данными.
Если вы закончите распаковку, то с помощью CRC32 легко проверить правильность только что распакованного потока.
Если файлы не такие большие, вы можете просто распаковать все записи в серии и сохранить смещения подписей, чтобы создать каталог. Когда вы распаковываете, сбрасывайте байты в ведро. На этом этапе вы сгенерируете каталог, и затем вы можете поддерживать произвольный доступ на основе имени файла, даты или других метаданных.
Это будет достаточно быстро для файлов размером менее 100 КБ. Как и предполагалось, если бы у вас было 10 файлов по 100 тыс. Каждый, это, вероятно, было бы сделано за 2 секунды на современном процессоре. Это то, что я имею в виду под «довольно быстро». Но только вы знаете требования к вашему заявлению.
Есть ли у вас класс GZipInputStream? Если это так, вы на полпути туда.