2009-11-11 6 views
2

J'ai certaines données qui occupent plus de 50 Mo dans un fichier non compressé, mais compresse jusqu'à moins d'un demi-Mo en utilisant gzip.Comment traiter les données compressées en Java

La plupart de ces données sont des données numériques. J'essaie de comprendre comment traiter ces données sans avoir à les décompresser complètement. Par exemple, si ces données contiennent un couple de chaînes et 5 valeurs numériques par enregistrement, y a-t-il un moyen de décompresser une seule ligne (ou un petit ensemble de lignes), de les traiter, puis de les supprimer?

Unix fournit des utilitaires tels que zcat, grep, etc. qui fonctionnent directement sur des données compressées, je voudrais faire la même chose en Java.

Merci

+0

50mb est pas beaucoup ... –

+0

Tous les outils Unix gzip basés essentiellement décompressez le fichier entier lorsque vous travaillez avec le contenu (sauf si tuyauterie à une application qui a fini sans lire tout). En d'autres termes, ils ne se comportent pas comme vous voulez que votre programme Java se comporte. –

+0

@ Thorbjørn: De quels outils parlez-vous? La plupart des outils décompresseront à la volée à moins que vous leur disiez d'écrire la sortie dans un fichier. –

Répondre

7

Juste envelopper votre FileInputStream dans un GZipInputStream:

public static BufferedReader createReader (File f, String encoding) throws IOException 
{ 
    try 
    { 
     InputStream in = new FileInputStream (f); 
     if (f.getName().endsWith (".gz")) 
      in = new GZIPInputStream (in, 10240); 

     return new BufferedReader (new InputStreamReader (in, encoding)); 
    } 
    catch (UnsupportedEncodingException e) 
    { 
     throw new RuntimeException("Missing encoding "+encoding, e); 
    } 
} 
Questions connexes