Domanda

Ho un file in formato .gz. La classe Java per la lettura di questo file è GZIPInputStream. Tuttavia, questa classe non si estende la classe BufferedReader di java. Di conseguenza, non sono in grado di leggere il file riga per riga. Ho bisogno di qualcosa di simile

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

I comunque di creare la mia classe che estende la classe BufferedReader Reader o di Java e utilizzare GZIPInputStream come uno dei suoi variabile.

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

}

Ma, questo non funziona quando uso

BufferedReader in = new BufferedReader(
    new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());

Can consiglio a qualcuno come procedere ..

È stato utile?

Soluzione

La configurazione di base di decoratori è come questo:

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

La questione chiave in questo frammento è il valore di encoding. Questa è la codifica dei caratteri del testo nel file. E ' "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9", ...? ci sono centinaia di possibilità, e la scelta corretta di solito non possono essere determinati dal file stesso. Deve essere specificato attraverso qualche canale out-of-band.

Per esempio, forse è il default della piattaforma. In un ambiente di rete, tuttavia, questo è estremamente fragile. La macchina che ha scritto il file potrebbe sedersi nella cabina vicina, ma hanno una codifica di file predefinito diverso.

La maggior parte dei protocolli di rete utilizzano un'intestazione o altri metadati notare esplicitamente la codifica dei caratteri.

In questo caso, risulta dal l'estensione del file che il contenuto è XML. XML include l'attributo "encoding" nella dichiarazione XML per questo scopo. Inoltre, XML in realtà dovrebbe essere elaborata con un parser XML, non come testo. La lettura linea per linea di XML sembra un fragile, caso speciale.

Non riuscendo a specificare esplicitamente la codifica è contro il secondo comandamento. usare la codifica predefinita a vostro rischio e pericolo!

Altri suggerimenti

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

È possibile utilizzare il seguente metodo in una classe util, e usarlo quando necessario ...

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

qui è con una riga

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(
           new GZIPInputStream(
              new FileInputStream(
                 "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) 
     {br.readLine();}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top