webentwicklung-frage-antwort-db.com.de

GZIPInputStream liest Zeile für Zeile

Ich habe eine Datei im .gz-Format. Die Java-Klasse zum Lesen dieser Datei ist GZIPInputStream. Diese Klasse erweitert jedoch die BufferedReader-Klasse von Java nicht. Daher kann ich die Datei nicht Zeile für Zeile lesen. Ich brauche so etwas

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

Ich habe zwar meine Klasse erstellt, die die Reader- oder BufferedReader-Klasse von Java erweitert, und benutze GZIPInputStream als eine seiner 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 das funktioniert nicht, wenn ich es benutze

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

Kann jemand raten, wie es weitergeht ..

73
Kapil D

Die Grundeinrichtung der Dekorateure sieht folgendermaßen aus:

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

Das Hauptproblem in diesem Snippet ist der Wert von encoding. Dies ist die Zeichencodierung des Textes in der Datei. Handelt es sich um "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9",…? Es gibt Hunderte von Möglichkeiten, und die richtige Auswahl kann normalerweise nicht aus der Datei selbst bestimmt werden. Es muss durch einen Out-of-Band-Kanal angegeben werden. 

Zum Beispiel ist es vielleicht der Standard der Plattform. In einer vernetzten Umgebung ist dies jedoch äußerst anfällig. Die Maschine, die die Datei geschrieben hat, befindet sich möglicherweise in der benachbarten Zelle, verfügt jedoch über eine andere Standardcodierung.

Die meisten Netzwerkprotokolle verwenden einen Header oder andere Metadaten, um die Zeichencodierung explizit zu notieren. 

In diesem Fall erscheint aus der Dateierweiterung, dass der Inhalt XML ist. XML enthält zu diesem Zweck das Attribut "encoding" in der XML-Deklaration. Außerdem sollte XML wirklich mit einem XML-Parser verarbeitet werden, nicht als Text. Das zeilenweise Lesen von XML scheint ein fragiler Sonderfall zu sein.

Wenn Sie die Kodierung nicht explizit angeben, handelt es sich um gegen das zweite Gebot.Verwenden Sie die Standardcodierung auf Ihre Gefahr!

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

40
ChssPly76
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 sie bei Bedarf verwenden ...

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

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();}
0
Tamer