web-dev-qa-db-fra.com

GZIPInputStream lecture ligne par ligne

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 ..

73
Kapil D

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!

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

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

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