Frage

Ich habe eine Datei in .gz-Format. Die Java-Klasse für diese Datei zu lesen ist GZIPInputStream. Allerdings ist diese Klasse nicht die BufferedReader-Klasse von Java erweitern. Im Ergebnis bin ich nicht in der Lage, die Datei Zeile für Zeile zu lesen. Ich brauche so etwas wie diese

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

ich aber meine Klasse zu schaffen, die den Reader oder BufferedReader-Klasse von Java erweitert und verwendet GZIPInputStream als eine ihrer Variablen.

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

}

Aber funktioniert das nicht, wenn ich

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

Kann jemand Rat, wie .. fortzufahren

War es hilfreich?

Lösung

Die Grundeinstellung von Dekorateure ist wie folgt:

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

Die zentrale Frage in diesem Snippet ist der Wert von encoding. Dies ist die Zeichenkodierung des Textes in der Datei. Ist es "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9", ...? gibt es Hunderte von Möglichkeiten, und die in der Regel richtige Wahl kann nicht aus der Datei selbst bestimmt werden. Es muss durch einige out-of-Band-Kanal angegeben werden.

Zum Beispiel, vielleicht ist es die Plattform Standard. In einer vernetzten Umgebung, aber das ist extrem fragil. Die Maschine, die die Datei geschrieben in der benachbarten Zelle sitzen könnte, aber eine andere Standarddateicodierung hat.

Die meisten Netzwerk-Protokolle verwenden, um einen Header oder andere Metadaten, um explizit die Zeichenkodierung zu beachten.

In diesem Fall ergibt sich aus der Dateierweiterung, die der Inhalt XML. XML enthält die „Codierung“ Attribut in der XML-Deklaration für diesen Zweck. Darüber hinaus XML sollte wirklich mit einem XML-Parser verarbeitet wird, nicht als Text. Lese von XML line-by-line scheint wie ein fragiler, Sonderfall dar.

Failing explizit die Codierung angeben, ist gegen das zweite Gebot. Verwenden Sie die Standard-Kodierung auf eigene Gefahr!

Andere Tipps

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

Sie können die folgende Methode in einer util-Klasse verwenden, und verwenden Sie es bei Bedarf ...

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

Hier ist mit einer Zeile

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(
           new GZIPInputStream(
              new FileInputStream(
                 "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) 
     {br.readLine();}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top