J'ai un fichier au format .gz. La classe Java permettant de lire ce fichier est GZIPInputStream. Cependant, cette classe n’étend pas la classe BufferedReader de Java. Par conséquent, je ne peux pas lire le fichier ligne par ligne. J'ai besoin de quelque chose comme ça
reader = new MyGZInputStream( some constructor of GZInputStream)
reader.readLine()...
Je pense créer ma classe qui étend la classe Reader ou BufferedReader de Java et utilise GZIPInputStream comme une de ses 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);
}
}
Mais ça ne marche pas quand j'utilise
BufferedReader in = new BufferedReader(
new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());
Quelqu'un peut-il conseiller comment procéder ..
La configuration de base des décorateurs est la suivante:
InputStream fileStream = new FileInputStream(filename);
InputStream gzipStream = new GZIPInputStream(fileStream);
Reader decoder = new InputStreamReader(gzipStream, encoding);
BufferedReader buffered = new BufferedReader(decoder);
La question clé dans cet extrait est la valeur de encoding
. C'est l'encodage de caractères du texte dans le fichier. Est-ce "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9", ...? il existe des centaines de possibilités et le choix correct ne peut généralement pas être déterminé à partir du fichier lui-même. Il doit être spécifié via un canal hors bande.
Par exemple, c'est peut-être la plateforme par défaut. Dans un environnement en réseau, cependant, cela est extrêmement fragile. La machine qui a écrit le fichier peut se trouver dans l’armoire voisine, mais avoir un encodage de fichier par défaut différent.
La plupart des protocoles de réseau utilisent un en-tête ou d'autres métadonnées pour noter explicitement le codage des caractères.
Dans ce cas, il ressort de l'extension de fichier que le contenu est XML. XML inclut l'attribut "encoding" dans la déclaration XML à cette fin. De plus, XML devrait vraiment être traité avec un analyseur XML, pas sous forme de texte. Lire XML ligne par ligne semble être un cas fragile et particulier.
Ne pas spécifier explicitement le codage est par rapport au deuxième commandement.Utilisez l'encodage par défaut à vos risques et périls!
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);
Vous pouvez utiliser la méthode suivante dans une classe util, et l'utiliser chaque fois que nécessaire ...
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;
}
voici avec une ligne
try (BufferedReader br = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"))))) {br.readLine();}