Tengo un archivo en formato .gz. La clase java para leer este archivo es GZIPInputStream. Sin embargo, esta clase no amplía 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 extiende la clase Reader o BufferedReader de Java y uso 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 aconsejarnos cómo proceder?
java
file-io
filereader
gzipinputstream
Kapil D
fuente
fuente
Respuestas:
La configuración básica de los decoradores es la siguiente:
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",…? hay cientos de posibilidades y, por lo general, la elección correcta no se puede determinar a partir del archivo en sí. Debe especificarse a través de algún canal fuera de banda.Por ejemplo, tal vez sea la plataforma predeterminada. En un entorno en red, sin embargo, esto es extremadamente frágil. La máquina que escribió el archivo puede ubicarse en el cubículo vecino, pero tiene una codificación de archivo predeterminada diferente.
La mayoría de los protocolos de red utilizan un encabezado u otros metadatos para anotar explícitamente la codificación de caracteres.
En este caso, a partir de la extensión del archivo, parece 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.
No especificar explícitamente la codificación va en contra del segundo mandamiento. ¡Utilice la codificación predeterminada bajo su responsabilidad!
fuente
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")); BufferedReader br = new BufferedReader(new InputStreamReader(gzip)); br.readLine();
fuente
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);
fuente
Puede utilizar el siguiente método en una clase util y utilizarlo siempre que sea necesario ...
public static List<String> readLinesFromGZ(String filePath) { List<String> 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; }
fuente
aquí está con una línea
try (BufferedReader br = new BufferedReader( new InputStreamReader( new GZIPInputStream( new FileInputStream( "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) {br.readLine();}
fuente