Question

J'ai un fichier au format .gz. La classe java pour la lecture de ce fichier est GZIPInputStream. Toutefois, cette classe ne couvre pas la classe BufferedReader de java. En conséquence, je ne suis pas en mesure de lire la ligne de fichiers en ligne. Je besoin de quelque chose comme ceci

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

Je pensais de créer ma classe qui étend le lecteur ou la classe BufferedReader de java et utiliser 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, cela ne fonctionne pas lorsque 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 des conseils comment procéder ..

Était-ce utile?

La solution

La configuration de base de 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);

La question clé dans cet extrait est la valeur de encoding. Ceci est le codage des 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 peuvent généralement pas être déterminées à partir du fichier lui-même. Il faut préciser par certains hors bande canal.

Par exemple, peut-être est la valeur par défaut de la plate-forme. Dans un environnement en réseau, cependant, ce qui est extrêmement fragile. La machine qui a rédigé le fichier peut s'asseoir dans la cabine voisine, mais ont un codage de fichier par défaut différent.

La plupart des protocoles réseau utilisent un en-tête ou d'autres métadonnées de noter explicitement l'encodage 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 à cet effet. En outre, XML devrait vraiment être traité avec un analyseur XML, et non pas sous forme de texte. ligne par ligne XML La lecture semble être un cas fragile, spécial.

A défaut de préciser explicitement le codage est contre le second commandement. Utiliser l'encodage par défaut à vos risques et périls!

Autres conseils

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 de l'utiliser si 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;
}

est ici avec une ligne

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(
           new GZIPInputStream(
              new FileInputStream(
                 "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) 
     {br.readLine();}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top