2009-05-23 56 views
6

Tengo 100 archivos .gz que necesito para comprimir. Tengo un par de preguntasdescomprimir archivo .gz en el lote

a) Estoy usando el código proporcionado en http://www.roseindia.net/java/beginners/JavaUncompress.shtml para descomprimir el archivo .gz. Funciona bien. Búsqueda: ¿hay alguna forma de obtener el nombre del archivo comprimido? Sé que la clase Zip de Java da la enumeración del archivo entery para trabajar. Esto puede darme el nombre de archivo, el tamaño, etc. almacenados en el archivo .zip. Pero, ¿tenemos lo mismo para los archivos .gz o el nombre del archivo es igual que filename.gz con .gz eliminado.

b) hay otra manera elegante de descomprimir el archivo .gz llamando a la función de utilidad en el código de java. Como llamar a la aplicación 7-zip de tu clase java. Entonces, no tengo que preocuparme por el flujo de entrada/salida.

Gracias de antemano. Kapil

Respuesta

9

a) Zip es un formato de archivo, mientras que gzip no lo es.Por lo tanto, un iterador de entrada no tiene mucho sentido a menos que (por ejemplo) sus archivos gz sean archivos tar comprimidos. Lo que quiere es probablemente:

File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", "")); 

b) ¿Desea descomprimir los archivos? Si no, puede estar bien con el uso de GZIPInputStream y leer los archivos directamente, es decir, sin descompresión intermedia.

Pero está bien. Digamos que realmente solo desea descomprimir los archivos. Si es así, probablemente podría usar esto:

public static File unGzip(File infile, boolean deleteGzipfileOnSuccess) throws IOException { 
    GZIPInputStream gin = new GZIPInputStream(new FileInputStream(infile)); 
    FileOutputStream fos = null; 
    try { 
     File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", "")); 
     fos = new FileOutputStream(outFile); 
     byte[] buf = new byte[100000]; 
     int len; 
     while ((len = gin.read(buf)) > 0) { 
      fos.write(buf, 0, len); 
     } 

     fos.close(); 
     if (deleteGzipfileOnSuccess) { 
      infile.delete(); 
     } 
     return outFile; 
    } finally { 
     if (gin != null) { 
      gin.close();  
     } 
     if (fos != null) { 
      fos.close();  
     } 
    }  
} 
+0

Hola, puedo leer los archivos sin dejar de leerlos. Quiero algo así como leerlo línea por línea. Y, los archivos pueden no tener solo 80 caracteres de longitud/línea. BufferedReader es lo que solía funcionar para mí. Pero no tiene un constructor para GzInputStream. –

+0

Escribo lo que quiero, como: BufferedReader in = new BufferedReader (new GzipFileReader (file)); Luego, implemente GzipFileReader como extends Reader. – fredarin

2

En cuanto a A, el comando gunzip crea un archivo descomprimido con el nombre original menos el sufijo .gz. Vea el man page.

En cuanto a B, ¿Necesita gunzip específicamente, o lo hará otro algoritmo de compresión? Hay un java port del algoritmo de compresión LZMA utilizado por 7zip para crear archivos .7z, pero no se manejará con los archivos .gz.

0

Si tiene una cantidad fija de archivos para descomprimir una vez, ¿por qué no usa las herramientas existentes para eso? Como notó Paul Morie, gunzip puede hacer eso: for i in *.gz; do gunzip $i; done y sería nombrar automáticamente, despojando .gz$

En Windows, pruebe winrar, probable o gunzip de http://unxutils.sf.net

0

gzip se utiliza normalmente sólo en una sola archivos, por lo que generalmente no contiene información sobre archivos individuales. Para agrupar varios archivos en un archivo comprimido, primero se combinan en un archivo Tar sin comprimir (con información sobre contenido individual) y luego se comprimen como un solo archivo. Esta combinación se llama Tarball.

Hay bibliotecas para extraer la información de archivo individual de un Tar, al igual que con ZipEntries. One example. Primero tendrá que extraer el archivo .gz en un archivo temporal para poder usarlo, o al menos alimentar el GZipInputStream en la biblioteca Tar.

También puede llamar a 7-Zip desde la línea de comandos usando Java. La sintaxis de la línea de comandos de 7-Zip está aquí: 7-Zip Command Line Syntax. Ejemplo de llamada al shell de comandos desde Java: Executing shell commands in Java. Tendrá que llamar a 7-Zip dos veces: una para extraer el Tar del archivo .tar.gz o .tgz, y nuevamente para extraer los archivos individuales del Tar.

O bien, puede hacer lo fácil y escribir un breve script de shell o un archivo por lotes para realizar la descompresión. No hay razón para martillar una clavija cuadrada en un agujero redondo: para eso están hechos los archivos por lotes. Como beneficio adicional, también puede alimentarlos con parámetros, lo que reduce considerablemente la complejidad de la ejecución de una línea de comando java, al tiempo que permite la ejecución del control java.

0

Ha intentado

gunzip *.gz 
0

.gz archivos (gzipped) pueden almacenar el nombre de archivo de un archivo comprimido. Entonces, por ejemplo, FuBar.doc se puede guardar dentro de myDocument.gz y con la descompresión adecuada, el archivo se puede restaurar con el nombre de archivo FuBar.doc. Desafortunadamente, java.util.zip.GZIPInputStream no admite ninguna forma de leer el nombre de archivo, incluso si está almacenado dentro del archivo.

Cuestiones relacionadas