2009-07-03 38 views
61

Tengo un archivo en formato .gz. La clase Java para leer este archivo es GZIPInputStream. Sin embargo, esta clase no extiende la clase BufferedReader de java. Como resultado, no puedo leer el archivo línea por línea. Necesito algo como estoGZIPInputStream leyendo línea por línea

reader = new MyGZInputStream(some constructor of GZInputStream) 
reader.readLine()... 

pensé en la creación de mi clase que se extiende el lector o la clase BufferedReader de Java y utilizar GZIPInputStream como uno de sus variables.

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.Reader; 
import java.util.zip.GZIPInputStream; 

public class MyGZFilReader extends Reader { 

    private GZIPInputStream gzipInputStream = null; 
    char[] buf = new char[1024]; 

    @Override 
    public void close() throws IOException { 
     gzipInputStream.close(); 
    } 

    public MyGZFilReader(String filename) 
       throws FileNotFoundException, IOException { 
     gzipInputStream = new GZIPInputStream(new FileInputStream(filename)); 
    } 

    @Override 
    public int read(char[] cbuf, int off, int len) throws IOException { 
     // TODO Auto-generated method stub 
     return gzipInputStream.read((byte[])buf, off, len); 
    } 

} 

embargo, esto no funciona cuando uso

BufferedReader in = new BufferedReader(
    new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz")); 
System.out.println(in.readLine()); 

pueden asesoramiento a alguien cómo proceder ..

+0

mira este enlace http://stackoverflow.com/q/6717165/779408. Aquí se representa un método de compresión y descompresión. – breceivemail

+0

Por el amor de todo lo que es bueno y correcto en este mundo y por la cordura de cualquier desarrollador que escriba código que sea remotamente valioso ... ¡ESTÉ CONSCIENTE DE CODIFICAR COMO @erickson SEÑALA! Él es la única respuesta que señala esto, lo que me da ganas de llorar. – James

Respuesta

114

La configuración básica de los decoradores es así:

InputStream fileStream = new FileInputStream(filename); 
InputStream gzipStream = new GZIPInputStream(fileStream); 
Reader decoder = new InputStreamReader(gzipStream, encoding); 
BufferedReader buffered = new BufferedReader(decoder); 

La cuestión clave en este fragmento es el valor de encoding. Esta es la codificación de caracteres del texto en el archivo. ¿Es "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9", & hellip ;? hay cientos de posibilidades, y la elección correcta generalmente no puede determinarse a partir del archivo en sí. Debe especificarse a través de un canal fuera de banda.

Por ejemplo, tal vez sea la plataforma predeterminada. En un entorno de red, sin embargo, esto es extremadamente frágil. La máquina que escribió el archivo puede sentarse en el cubículo contiguo, pero tiene una codificación de archivo predeterminada diferente.

La mayoría de los protocolos de red usan un encabezado u otros metadatos para anotar explícitamente la codificación de caracteres.

En este caso, la extensión de archivo indica que el contenido es XML. XML incluye el atributo "codificación" en la declaración XML para este propósito. Además, XML realmente debería procesarse con un analizador XML, no como texto. Leer XML línea por línea parece un caso especial y frágil.

Error al especificar explícitamente que la codificación es against the second commandment.¡Use la codificación predeterminada bajo su propio riesgo!

+1

gracias funcionó ... Sin embargo, no hay necesidad de paso del lector ... también podemos escribirlo como GZIPInputStream gzip = new GZIPInputStream (new FileInputStream ("F: /gawiki-20090614-stub-meta-history.xml. gz ")); \t \t BufferedReader br = new BufferedReader (new InputStreamReader (gzip)); –

+12

@KapilD me entristece que hayas omitido por completo su punto sobre la codificación ... como lo muestran tu comentario y el ejemplo en tu comentario.Vuelve a leer la respuesta de Erickson ... tal vez 30 veces más. – James

+0

¿Cómo sabe el comando gzip la codificación? Quiero leer muchos archivos de muchos servidores Linux/Unix de todo el mundo ... así que quiero asegurarme de hacerlo bien ... La codificación de menciones de publicaciones generalmente no puede ser determinada por el archivo en sí. ... pero el comando gzip -d parece funcionar en cualquier archivo sin entrada separada ... (es lo que uso ahora pero quiero eludir) así que me pregunto si puedo averiguar qué hace gzip para conocer la codificación, puede hacer lo mismo. Cualquier pensamiento/sugerencia ¿alguien puede señalarme en la dirección correcta? – glyphx

0

¿Qué hay de:

GZIPInputStream zipReader = new GZIPInputStream(); 
InputStreamReader streamReader = new InputStreamReader(zipReader); 
BufferedReader bufferedReader = new BufferedReader(streamReader); 
34
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")); 
BufferedReader br = new BufferedReader(new InputStreamReader(gzip)); 
br.readLine(); 

+0

Tu respuesta es genial. Breve y conciso ... Sin embargo, la respuesta de Erickson es más detallada. –

3
BufferedReader in = new BufferedReader(new InputStreamReader(
     new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")))); 

String content; 

while ((content = in.readLine()) != null) 

    System.out.println(content); 
Cuestiones relacionadas