Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132

    [JAVA] estrarre una entry (contenuta in una cartella) da archivio in una directory.

    Ciao a tutti.

    Ho un problema riguardante l'estrazione di una entry da un archivio che è dentro una cartella dell'archivio stesso.

    Io uso lo stesso codice che ho trovato tra i vari esempi della sun:

    codice:
    import java.io.*;
    import java.util.*;
    import java.util.zip.*;
    
    public class UnZip2 {
       static final int BUFFER = 2048;
       public static void main (String argv[]) {
          try {
             BufferedOutputStream dest = null;
             BufferedInputStream is = null;
             ZipEntry entry;
             ZipFile zipfile = new ZipFile(argv[0]);
             Enumeration e = zipfile.entries();
             while(e.hasMoreElements()) {
                entry = (ZipEntry) e.nextElement();
                System.out.println("Extracting: " +entry);
                is = new BufferedInputStream
                  (zipfile.getInputStream(entry));
                int count;
                byte data[] = new byte[BUFFER];
                FileOutputStream fos = new 
                  FileOutputStream(entry.getName());
                dest = new 
                  BufferedOutputStream(fos, BUFFER);
                while ((count = is.read(data, 0, BUFFER)) 
                  != -1) {
                   dest.write(data, 0, count);
                }
                dest.flush();
                dest.close();
                is.close();
             }
          } catch(Exception e) {
             e.printStackTrace();
          }
       }
    }
    Il problema è nel fatto che se la entry è contenuta in una cartella il metodo entry.getName restituisce una cosa del tipo directory/nomeEntry quindi alla riga

    codice:
    FileOutputStream fos = new FileOutputStream(entry.getName());
    mi genera una

    codice:
    java.io.FileNotFoundException: jEdit-2.3pre4\jedit.jar (Impossibile trovare il percorso specificato)
    invece se a quel codice sostituisco

    codice:
    FileOutputStream fos = new FileOutputStream("jedit.jar")
    esegue tutto senza errori salvandomela nella cartella root del progetto.

    Ora ho pensato posso usare il metodo split di string (su entry.getName()) e tenere solo l'ultimo valore (il vero nome del file senza directory) solo che io devo poter salvare il file dentro la stessa directrory dove si trova l'archivio e dentro una cartella chiamata dir001.

    1) E' giusto come ho pensato di ovviare il problema dell'eccezione?
    2) Come posso fare per eseguire il salvataggio all'interno di directory?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] estrarre una entry (contenuta in una cartella) da archivio in una director

    Originariamente inviato da mainetz
    Il problema è nel fatto che se la entry è contenuta in una cartella il metodo entry.getName restituisce una cosa del tipo directory/nomeEntry quindi alla riga

    codice:
    FileOutputStream fos = new FileOutputStream(entry.getName());
    mi genera una

    codice:
    java.io.FileNotFoundException: jEdit-2.3pre4\jedit.jar (Impossibile trovare il percorso specificato)
    Da quello che ho capito, il tuo problema è la creazione sul file-system delle directory presenti nell'archivio. Ti basta creare dal nome della entry un oggetto File, invocare getParentFile() per ottenere un File che rappresenta la/e directory e quindi su questo invocare mkdirs() (s finale) per creare sul file-system tutte le eventuali directory necessarie.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ecco una semplice e minimale classe per estrarre da un archivio zip:

    codice:
    import java.io.*;
    import java.util.*;
    import java.util.zip.*;
    
    public class Unzipper
    {
        public static void main (String[] args)
        {
            if (args.length == 1)
            {
                try
                {
                    unzipFile (args[0]);
                }
                catch (Exception e)
                {
                    System.out.println (e);
                }
            }
            else
                System.out.println ("Usage: java Unzipper <zipfile>");
        }
    
        private static void unzipFile (String zipFileName)
            throws IOException
        {
            ZipFile zipFile = new ZipFile (zipFileName);
    
            try
            {
                Enumeration<? extends ZipEntry> entriesEnum = zipFile.entries ();
    
                while (entriesEnum.hasMoreElements ())
                {
                    ZipEntry zipEntry = entriesEnum.nextElement ();
    
                    extractEntry (zipEntry, zipFile.getInputStream (zipEntry));
                }
            }
            finally
            {
                zipFile.close ();
            }
        }
    
        private static void extractEntry (ZipEntry zipEntry, InputStream is)
            throws IOException
        {
            String name = zipEntry.getName ();
            File file = new File (name);
    
            if (zipEntry.isDirectory ())
            {
                System.out.println ("creating directory: " + name + " ...");
    
                file.mkdirs ();
            }
            else
            {
                System.out.println ("extracting file: " + name + " ...");
    
                File path = file.getParentFile ();
                if (path != null)
                    path.mkdirs ();
    
                FileOutputStream fos = new FileOutputStream (file);
    
                try
                {
                    byte[] buffer = new byte[4096];
                    int len;
    
                    while ((len = is.read (buffer)) > 0)
                        fos.write (buffer, 0, len);
                }
                finally
                {
                    fos.close ();
                }
            }
    
            long time = zipEntry.getTime ();
    
            if (time != -1)
                file.setLastModified (time);
        }
    }
    P.S.: in effetti mi ero dimenticato che nell'archivio ci sono anche le entry per le directory! In teoria prendere la directory del file con getParentFile () e poi fare mkdirs() non servirebbe, visto che viene già prima la entry della directory. Male non fa, quindi per sicurezza meglio farlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Grazie mille per la risposta avrei però una domanda...

    Questo pezzo di codice:

    codice:
    File path = file.getParentFile ();
                if (path != null)
                    path.mkdirs ();
    assegna a path le il percorso della entry (es: dir1/subDir2/entryName path=dir1/subDir2) e il comando path.mkdirs() crea le directory a partire dalla directory radice del progetto.

    Come posso invece far creare le nuove directory dalla directory ove è contenuto l'archivio?

    Grazie.

    mainetz.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mainetz
    Grazie mille per la risposta
    Prego, però in effetti, pensandoci bene, il mio codice è sicuramente migliorabile. Non ho fatto una cosa: chiudere l'InputStream di una entry. Non è grave, la documentazione dice che facendo un close() sullo ZipFile (cosa che ho fatto) vengono chiusi tutti gli stream ancora aperti.

    Poi sarebbe stato meglio separare, a livello di metodi, la estrazione di una directory da quella di un file. Infatti l'InputStream non serve per una directory.
    Appena ho tempo lo modifico/miglioro e magari chiedo ad un mod di aggiornare il mio post.

    Originariamente inviato da mainetz
    Come posso invece far creare le nuove directory dalla directory ove è contenuto l'archivio?
    Per aprire l'archivio può essere specificato un path es. "..\pippo.zip" oppure "D:\prova\pippo.zip" (che è poi quello che passi per creare un ZipFile).

    Basta che prendi il "parent" path di questo path per ottenere la directory dell'archivio e poi questo path lo usi come "parent" quando crei tutte le directory e i file.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.