Ich habe eine Datei im GZ-Format. Die Java-Klasse zum Lesen dieser Datei ist GZIPInputStream. Diese Klasse erweitert jedoch nicht die BufferedReader-Klasse von Java. Infolgedessen kann ich die Datei nicht zeilenweise lesen. Ich brauche so etwas
reader = new MyGZInputStream( some constructor of GZInputStream)
reader.readLine()...
Ich möchte meine Klasse erstellen, die die Java-Klasse Reader oder BufferedReader erweitert, und GZIPInputStream als eine ihrer Variablen verwenden.
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 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 ..
java
file-io
filereader
gzipinputstream
Kapil D.
quelle
quelle
Antworten:
Die Grundausstattung der Dekorateure sieht folgendermaßen aus:
Das Hauptproblem 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", ...? Es gibt Hunderte von Möglichkeiten, und die richtige Auswahl kann normalerweise nicht aus der Datei selbst ermittelt werden. Es muss über einen Out-of-Band-Kanal angegeben werden.Zum Beispiel ist es vielleicht die Plattformvorgabe. In einer vernetzten Umgebung ist dies jedoch äußerst fragil. Der Computer, der die Datei geschrieben hat, befindet sich möglicherweise in der benachbarten Kabine, hat jedoch eine andere Standarddateicodierung.
Die meisten Netzwerkprotokolle verwenden einen Header oder andere Metadaten, um die Zeichencodierung explizit zu notieren.
In diesem Fall geht aus der Dateierweiterung hervor, dass der Inhalt XML ist. XML enthält zu diesem Zweck das Attribut "encoding" in der XML-Deklaration. Darüber hinaus sollte XML wirklich mit einem XML-Parser verarbeitet werden, nicht als Text. Das zeilenweise Lesen von XML scheint ein fragiler Sonderfall zu sein.
Wenn die Codierung nicht explizit angegeben wird, verstößt dies gegen das zweite Gebot. Verwenden Sie die Standardcodierung auf eigene Gefahr!
quelle
quelle
quelle
Sie können die folgende Methode in einer util-Klasse verwenden und sie bei Bedarf verwenden ...
quelle
hier ist mit einer Zeile
quelle