GZIPInputStream leyendo línea por línea

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 esto

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

Pensé en crear mi clase que amplía la clase Reader o BufferedReader de java y usar GZIPInputStream como una 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); } } 

Pero esto no funciona cuando uso

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

¿Alguien puede aconsejar cómo proceder?

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); 

El problema clave en este fragmento es el valor de la encoding . Esta es la encoding de caracteres del texto en el archivo. ¿Es “US-ASCII”, “UTF-8”, “SHIFT-JIS”, “ISO-8859-9”, …? 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 encoding de archivo predeterminada diferente.

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

En este caso, de la extensión de archivo aparece que el contenido es XML. XML incluye el atributo “encoding” en la statement 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.

No poder especificar explícitamente la encoding está en contra del segundo mandamiento. ¡Usa la encoding predeterminada bajo tu propio riesgo!

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

 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); 

Puede usar el siguiente método en una clase de utilidades y usarlo siempre que sea necesario …

 public static List readLinesFromGZ(String filePath) { List lines = new ArrayList<>(); File file = new File(filePath); try (GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(file)); BufferedReader br = new BufferedReader(new InputStreamReader(gzip));) { String line = null; while ((line = br.readLine()) != null) { lines.add(line); } } catch (FileNotFoundException e) { e.printStackTrace(System.err); } catch (IOException e) { e.printStackTrace(System.err); } return lines; }