Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347

    [JAVA] - caricamento risorse

    buon pomeriggio,
    ho un problema. Dal mio ambiente di sviluppo mi sto caricando una risorsa in questo mode:
    codice:
    InputStream is = getClass().getResourceAsStream(File.separator+"source"+File.separatorChar+"prova.txr");
    e fin qui tutto ok.

    Ma quando creo il jar e lo eseguo, la mia risorsa non viene più trovata.
    Qualche idea per aggirare il problema?
    thanx
    nh

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

    Re: [JAVA] - caricamento risorse

    Originariamente inviato da newhook
    ho un problema. Dal mio ambiente di sviluppo mi sto caricando una risorsa in questo mode:
    codice:
    InputStream is = getClass().getResourceAsStream(File.separator+"source"+File.separatorChar+"prova.txr");
    e fin qui tutto ok.

    Ma quando creo il jar e lo eseguo, la mia risorsa non viene più trovata.
    Permettimi di fare qualche premessa.

    Innanzitutto il nome che si passa a getResource/getResourceAsStream non è una specifica sul file-system e nemmeno un URL nel senso generale (come si intende normalmente).
    Invece è una specifica abbastanza particolare dove tra l'altro si dovrebbe sempre usare '/' per separare i path.
    L'uso di File.separator/File.separatorChar è dubbio/discutibile. Perché su Windows equivale al \ che rende abbastanza malformato il URL complessivo che quei metodi determinano. Anche se tecnicamente poi dovrebbe riuscire a leggere dalla risorsa.

    Quindi in linea generale: si usa / nella specifica della risorsa.

    Altro punto è quello di sapere come e dove vengono cercate le risorse. Non conta di per sé la directory "corrente" e non conta nemmeno dove sono fisicamente i jar.
    Conta il "classpath" !! Le risorse vengono cercate lungo il classpath.

    Se la specifica della risorsa inizia con / allora viene cercata alla "radice" (non in un package per intenderci), altrimenti viene cercata basandosi sul package della classe sul cui java.lang.Class è stato invocato il getResource(AsStream).

    Per chiarire, immaginiamo che in classpath (ad esempio sfruttando la variabile di ambiente CLASSPATH) ci siano 2 directory e 1 jar:

    C:\Progetti\demo;C:\Programmi\miaapp.jar;C:\Prove

    Se si ha una classe org.test.Prova e si fa ad esempio:

    Prova.class.getResource("img/icona.gif")

    allora la sequenza di ricerca è:

    C:\Progetti\demo\org\test\img\icona.gif
    poi
    org/test/img/icona.gif dentro C:\Programmi\miaapp.jar (org è una cartella alla "radice" del jar)
    poi
    C:\Prove\org\test\img\icona.gif

    Il primo che trova ... è ok.
    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
    Jun 2009
    Messaggi
    347
    ok, in base a quello che mi hai detto :"Se la specifica della risorsa inizia con / allora viene cercata alla "radice" " ho fatto in questo modo:

    codice:
    URL config = getClass().getResource("/aa/ss/dd/prova.txt");
    InputStream is = config.openStream();
    e tutto funziona sia in ambiente di sviluppo che non!
    precedentemente mi parlavi di File.separator sostituirlo che /.
    Che ne dici di System.getenv("file.separator") ? Lavora bene anche sotto linux?

    Grazie mille!!!
    nh

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da newhook
    hai detto :"Se la specifica della risorsa inizia con / allora viene cercata alla "radice" "
    Rileggendo quanto detto penso che potevo esprimerlo meglio! La questione è che con / iniziale la specifica è "assoluta" e parte dalla "radice". Quindi specificando es. "/img/icona.gif" non conta più il package del Class usato .... viene proprio cercato un "icona.gif" come se fosse nel unico package "img".

    Originariamente inviato da newhook
    precedentemente mi parlavi di File.separator sostituirlo che /.
    Che ne dici di System.getenv("file.separator") ? Lavora bene anche sotto linux?
    Ripeto che per le specifiche delle "risorse", con getResource(AsStream), si dovrebbe usare / e basta. Non si dovrebbe usare "il separatore del sistema".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    ok, grande!!! lavora anche sotto linux.
    ti doco cosa ho fatto(giusto per completezza ed eventuali consigli estetici):

    mi sono fatto dare il nome del package getClass().getPackage().getName();
    poi ho sostituito i punti con / (fisso). li ho aggiunti sia all'inizio che alla fine.
    ho aggiunto la risorsa
    e ho creato l'url getClass().getResource(pathRisorsaConSlash);

    e tutto funziona.
    grazie

    nh

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da newhook
    mi sono fatto dare il nome del package getClass().getPackage().getName();
    poi ho sostituito i punti con / (fisso). li ho aggiunti sia all'inizio che alla fine.
    A dire il vero non capisco tutto questo procedimento macchinoso.

    Le "risorse" si usano quando si devono usare immagini o qualunque altro file che "fa parte" della applicazione. Quindi si "sa" quali risorse usare e dove sono.

    Se ho una classe com.pippo.Prova che sta in un jar, allora avrò un Prova.class che sta dentro un percorso com/pippo partendo dalla "radice" del jar.

    Se voglio caricare una risorsa, es. "icona.gif", potrei pensare di metterla nello stesso package della classe (com.pippo) e quindi di farla andare in com/pippo nel jar.

    A quel punto basta fare:

    Prova.class.getResource("icona.gif") o con getResourceAsStream

    Insomma, non capisco le complicazioni che stai dicendo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    347
    si è vero...però la mia struttura è questa:
    il package che contiene le risorse, è fratello della classe che le richiama e viaggiano a braccetto, nel senso che se un giorno sposto la classe, sposterò anche il package risorse senza dover rimettere mani al codice.

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.