Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    listFile da cartella interna jar , è possibile?

    Ho un jar strutturato (internamente) similmente così:
    codice:
    -META-INF
       -MANIFEST.MF
    -nomeProgetto
       -images (è una cartella)
          -cartella1 (è una cartella)
          -cartella2 (è una cartella)
       -music (è una cartella)
       -tuttiFileClass.class
    Supponiamo che io voglia ottenere la lista di tutti i file contenuti in nomeProgetto.images.cartella1.
    Ho fatto nel seguente modo:
    codice:
    File dir = new File (getClass ().getResource ("/nomeProgetto/images/cartella1").toURI ());
    File [] files = dir.listFiles ();
    Facendo in questo modo il tutto funziona se lo eseguo dall'IDE (Netbeans , probabilmente per questioni di classpath) mentre se avvio da linea di comando ottengo una eccezione con messaggio "URI is not hierarchical"

    Ho provato , tramite suggerimenti online , a seguire la seguente procedura:

    codice:
    File dir = new File ((JarURLConnection)(getClass ().getResource ("/nomeProgetto/images/cartella1").openConnection ()).getJarFileURL ().getFile ());
    File [] files = dir.listFiles ();
    Ma così facendo se avvio da terminale ottengo un "NullPointerException" , mentre da IDE un "ClassCastException: sun.net.www.protocol.file.FileURLConnection cannot be cast to java.net.JarURLConnection"

    C'è un modo per risolvere?Se dovessi fare a mano il procedimento per ogni singolo file sarebbe veramente laborioso..
    Ultima modifica di zipangulu; 06-11-2013 a 18:36

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da zipangulu Visualizza il messaggio
    Supponiamo che io voglia ottenere la lista di tutti i file contenuti in nomeProgetto.images.cartella1.
    C'è un modo per risolvere?
    Detto in generale, se hai (o riesci ad ottenere indirettamente) il pathname di un file .zip/.jar, è perfettamente possibile enumerare il contenuto usando le classi nei package java.util.zip / java.util.jar.

    Se invece intendi ragionare in termini di "risorse" e "classpath" .... beh, qui è più critico. Voglio però far notare che ClassLoader ha un metodo Enumeration<URL> getResources(String name). In tanti anni che programmo in Java .. non l'ho mai usato! Quindi sarebbe da provare ....
    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
    Registrato dal
    Nov 2009
    Messaggi
    755
    Detto in generale, se hai (o riesci ad ottenere indirettamente) il pathname di un file .zip/.jar, è perfettamente possibile enumerare il contenuto usando le classi nei package java.util.zip / java.util.jar.
    Sì , è quello che sto cercando di fare , senza successo , con i frammenti di codice che ho postato , no?Quindi come si può risolvere?

    Se invece intendi ragionare in termini di "risorse" e "classpath" .... beh, qui è più critico. Voglio però far notare che ClassLoader ha un metodo Enumeration<URL> getResources(String name). In tanti anni che programmo in Java .. non l'ho mai usato! Quindi sarebbe da provare ....
    Probabilmente non ho ben capito la sua funzione e come va richiamato/utilizzato ma provando ad utilizzarlo nel seguente modo:

    codice:
    Enumeration<URL> e = getClass ().getClassLoader ().getResources ("/nomeProgetto/images/cartella1");
    while (e.hasMoreElements ()) {
       System.out.println (e.nextElement ());
    }
    non ottengo niente!
    Ultima modifica di zipangulu; 07-11-2013 a 01:04

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Come ti ha già detto giustamente andbin, non lo puoi fare con la classe File di java.io ed i suoi metodi perchè le entry di un ZIP / JAR non sono File, ma sono "risorse" (ovvero dati) di un file. Puoi enumerare le Entry, usando le classi di java.util.zip o java.util.jar, rispettivamente usando ZipFile/JarFile per aprire il file zip/jar e scorrerlo.

    Da dentro all'IDE funziona perchè l'IDE non usa il JAR quando manda in esecuzione il programma, ma usa i file .class sciolti che risiedono nella directory "build" (o altro simile per Eclipse), ovvero utilizza i file sciolti derivanti dalla compilazione, che sono veri file del filesystem.

    Un esempio di programma che estrae le entry di un file JAR (quindi, che le scorre), lo trovi qui:
    http://stackoverflow.com/questions/1...-its-data-in-s

    alla risposta di JuanZe

    Quel frammento di codice fa di più: le scorre e ne crea i relativi file sul filesystem, ma a te interessa solo la lettura e lo scorrimento delle entry.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Come ti ha già detto giustamente andbin, non lo puoi fare con la classe File di java.io ed i suoi metodi perchè le entry di un ZIP / JAR non sono File, ma sono "risorse" (ovvero dati) di un file. Puoi enumerare le Entry, usando le classi di java.util.zip o java.util.jar, rispettivamente usando ZipFile/JarFile per aprire il file zip/jar e scorrerlo.
    Capito tutto..mi era sfuggita , pur conoscendola , la differenza file/risorsa.
    Grazie 1000!

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.