GZIPInputStream lecture ligne par ligne

J’ai un fichier au format .gz. La classe Java pour la lecture de 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()... 

J’ai cependant créé 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(Ssortingng 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 comme ceci:

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

Le problème majeur de cet extrait est la valeur du encoding . C’est le codage de caractères du texte dans le fichier. Est-ce “US-ASCII”, “UTF-8”, “SHIFT-JIS”, “ISO-8859-9”,…? il y a des centaines de possibilités, et le bon choix 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 la cellule voisine, mais avoir un encodage de fichier par défaut différent.

La plupart des protocoles réseau utilisent un en-tête ou d’autres métadonnées pour noter explicitement le codage des caractères.

Dans ce cas, l’extension de fichier indique que le contenu est XML. XML inclut l’atsortingbut “encoding” dans la déclaration XML à cet effet. De plus, XML devrait vraiment être traité avec un parsingur XML, pas sous forme de texte. Lire XML ligne par ligne semble être un cas particulier fragile.

Ne pas spécifier explicitement le codage est contraire au second 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")))); Ssortingng content; while ((content = in.readLine()) != null) System.out.println(content); 

Vous pouvez utiliser la méthode suivante dans une classe util et l’utiliser autant que nécessaire …

 public static List readLinesFromGZ(Ssortingng filePath) { List 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; }