java - una - GZIPInputStream leyendo línea por línea
interfaz grafica para netbeans (3)
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 codificación 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 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, de la extensión de archivo aparece 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 poder especificar explícitamente la codificación está en contra del segundo mandamiento. ¡Usa la codificación predeterminada bajo tu propio riesgo!
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?
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);
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"));
BufferedReader br = new BufferedReader(new InputStreamReader(gzip));
br.readLine();