Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Apertura di un file .gz

    Salve a tutti,
    dovrei leggere dei file di testo compressi con estensione .gz ma non so esattamente come fare...finora infatti li avevo scompattati e avevo creato una classe di lettura che estraesse i dati dentro il file nella maniera a me più congeniale. Tuttavia ho constatato che i file sono moltissimi e ognuno è zippato(se fosse stata solo la cartella nn credo sarebbe stato un grosso problema) e quando lo decomprimo aumenta molto le sue dimensioni. La cosa migliore da fare sarebbe decomprimerlo, leggerlo e restiturimi i risultati, senza che però il file decompresso rimanga nell'hard disk, ossia che rimanga .gz. In rete avevo trovato un'istruzione del tipo:

    codice:
    DataInputStream dis = new DataInputStream(new GZIPInputStream(new FileInputStream("prv.Gz")));
    che vorrei usare per modificare il seguente pezzo del mio programma:
    codice:
    File file = new File(filename.toString());
    ReadNextGenFile results = new ReadNextGenFile(file);
    dove quest'ultima istruzione richiama la seguente classe di lettura, di cui riporto le parti principali:

    codice:
    //costruttore
    public ReadNextGenFile(String stringFile) {
            try {
                    Scanner sc = new Scanner(new File(stringFile));
             ...
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }
    
            public ReadNextGenFile(File file) {
                    this(file.getAbsolutePath());
            }
    Avevo provato a scrivere qualcosa del tipo:
    codice:
    DataInputStream file = new DataInputStream(new GZIPInputStream(new
    FileInputStream(filename.toString())));
    ReadNextGenFile results = new ReadNextGenFile(file);
    Non appena faccio questo eclipse mi segnala di modificare i parametri del costruttore della classe ReadNextGenFile , passando da string a datainputstream, ma così facendo nn funziona più nulla perchè il metodo che ho scritto dopo il costruttore andrebbe modificato, ma nn ho idea di come operare (nn ho dimestichezza con la lettura da file)...

    Spero che il problema sia chiaro, vi ringrazio anticipatamente per le eventuali risposte.

  2. #2
    E se si provasse a deconmprimere il file, leggerlo e cancellare il file decompresso secondo voi è meglio? Qual'è la soluzione migliore?

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Se non vuoi/non puoi utilizzare i metodi (di lettura) messi a disposizione da

    http://java.sun.com/j2se/1.5.0/docs/...putStream.html

    (read)

    allora non ti resta che estrarre il file e passarlo alla tua classe ReadNextGenFile. Conta che sarebbe fare doppio lavoro, perché tanto per estrarre il file devi passare per il read di GZInputStream.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Non è che non voglio, ma semplicemente non ho capito come dovrei cambaire la mia classe di lettura, tutto qui...

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ah, ok, bhè, allora devi aggiungere un costruttore con altra firma

    per esempio

    codice:
    public ReadNextGenFile(InputStream is) {
      //fai qualcosa con l'input stream
      //per esempio si legge sottoforma di array di byte
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Scusami, purtroppo non sono molto pratica e non ho ben capito cosa dovrei fare... avevo già capito che dovevo modificare il costruttore, ma quello che non ho capito è come modificare il resto. Infatti quello che dà più problemi è il metodo che mi restituisce il nome del file che poi dò in pasto alla classe scanner, se provo a fare come dici tu, cosa che avevo già fatto prima, la classe scanner mi dà problemi. Insomma non so come unire le due cose!!! Idem se provo a scrivere:

    codice:
    DataInputStream ris = new DataInputStream(new GZIPInputStream(new FileInputStream(new File(filename.toString()))));
    VI PREGO AIUTATEMI!!!

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Faceva schifo leggersi le API (tra l'altro linkate), eh?

    codice:
    try {
      GZIPInputStream gzs = new GZIPInputStream(new FileInputStream(GZFile));
      byte[] buf = new byte[gzs.available()];
      File tmpFile = File.createTempFile("hellokitty", ".txt");
      FileOutputStream fos = new FileOutputStream(tmpFile);
      int c;
      while ((c = gzs.read(buf)) != -1) {
        fos.write(buf);
      }
      fos.flush();
      fos.close();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    a quel punto in tmpFile hai il File da passare a ReadNextGenFile.
    Buona serata, vado ad avvinazzarmi.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Grazie per la risposta, il link l'ho guardato ma senza capirci molto...

    La tua soluzione funziona, ho un solo dubbio: poichè impiega molto tempo per girare, non è che per caco rimane tutto il tempo in memoria finchè il programma non finisce? Oppure impiega solo più tempo perchè deve decomprimere? Io penso sia quest'ultima...

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Dipende da diversi fattori: dalla (de)compressione del file, dal fatto che in questo modo deve fare 2 volte la lettura e una scrittura, dal fatto che volutamente per semplificare il codice ho caricato un buffer di lettura di dimensione pari a tutto il file decompresso. E' solo uno spunto e seppure funzionante, va chiaramente ottimizzato per il caso specifico: se sai già come andare a trattare i dati, fatti un altro costruttore come stavi provando a fare che elimini una lettura ed un eventuale scrittura: attualmente quel che succede è:

    - viene aperto e decompresso il file gz (con lettura del contenuto)
    - viene scritto tale contenuto decompresso in un file temporaneo
    - viene passato il riferimento a tale file temporaneo alla tua classe (che procederà quindi, quanto meno, ad una nuova lettura).

    L'ottimizzazione minima da mettere in atto è, se possibile, procedere con la manipolazione dei dati alla prima lettura ossia in fase di estrazione.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10
    Sinceramente, forse perchè non sono molto pratica, avevo capito che in questo modo dovesse solo decomprimere e leggere il file. Oltrettuto non avevo capito bene come funziona GZIPInputStream, perchè pensavo che prima servisse decomprimere e poi leggere a parte. Tuttavia se le cose possono essere fatte di seguito, e forse l'istruzione che avevo postato inizialmente andava bene, sarebbe ovviamente molto meglio. Come avevo scritto in precedenza, non so esattamente come passare da File a FileInputStream, in modo che la classe scanner mi riconosca il percorso del file, tutto qui. Magari è più banale di quanto io non immagini, forse farò pure la figura della rimbecillita, ma non ho idea di come si faccia.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.