2009-08-04 13 views
5

Esto puede caer en el ámbito de "no es realmente factible" o "no vale la pena el esfuerzo", pero aquí va.Acceso aleatorio de archivos gzip multiparte (en Java)

Estoy tratando de acceder aleatoriamente a los registros almacenados dentro de un archivo gzip de varias partes. Específicamente, los archivos que me interesan son comprimidos Heretrix Arc files. (En caso de que no esté familiarizado con los archivos gzip de varias partes, la especificación gzip permite que múltiples flujos gzip se concatenen en un solo archivo gzip. No comparten ninguna información del diccionario, es simple anexar un binario)

Estoy pensando que debería ser posible hacerlo buscando un cierto desplazamiento dentro del archivo, luego buscar los bytes del encabezado mágico gzip (es decir, 0x1f8b, según el RFC) e intentar leer la secuencia gzip de los siguientes bytes . El problema con este enfoque es que esos mismos bytes también pueden aparecer dentro de los datos reales, por lo que buscar esos bytes puede llevar a una posición no válida para comenzar a leer una secuencia gzip. ¿Hay una mejor manera de manejar el acceso aleatorio, dado que las compensaciones de registros no se conocen a priori?

Respuesta

1

El diseño de GZIP, como se ha dado cuenta, no es amigable para el acceso aleatorio.

Puede hacer lo que describe y, a continuación, si se encuentra con un error en el descompresor, concluya que la firma que encontró era en realidad datos comprimidos.
Si termina de descomprimir, entonces es fácil verificar la validez de la secuencia recién descomprimida, a través del CRC32.

Si los archivos no son tan grandes, puede considerar simplemente descomprimir todas las entradas en serie y conservar los desplazamientos de las firmas para construir un directorio. A medida que descomprime, vacíe los bytes en un cubo de bits. En ese momento, habrá generado un directorio, y luego podrá admitir acceso aleatorio según el nombre de archivo, la fecha u otros metadatos.

Esto será razonablemente rápido para archivos de menos de 100k. Solo como una suposición, si tuviera 10 archivos de alrededor de 100k cada uno, probablemente se haría en 2s en una CPU moderna. Esto es lo que quiero decir con "bastante rápido". Pero solo usted conoce los requisitos de rendimiento de su aplicación.

¿Tiene una clase GZipInputStream? Si es así, estás a mitad de camino allí.

Cuestiones relacionadas