Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Josten
    Registrato dal
    Jan 2011
    Messaggi
    25

    copiare file da dentro il jar a una cartella

    Salve a tutti... da quanto ho visto pare sia un problema comune..
    ho all'interno di un jar una risorsa ovvero un jar che devo copiare in una cartella..

    questo jar è esattamente nello stesso path di un immagine che riesco correttamente a prelevare e utilizzare

    ovvero

    codice:
    getClass().getResource("/myapp/shield.png")
    nella stessa cartella ho il mio jar da prelevare e riesco a prendere il suo percorso con

    codice:
    (getClass().getResource("client.jar").getPath())
    e ottengo con una stampa questo:

    codice:
    file:/Users/josten/NetBeansProjects/progetto/store/myapp.jar!/myapp/client.jar
    ovviamente se lo passo al FileInputStream per copiarlo nella cartella che voglio mi da errore..

    come posso sistemarlo?

    fis = new FileInputStream((getClass().getResource("client.ja r").getPath()));

    fos = new FileOutputStream(installPathfile+"/client.jar");

    ah aggiungo, tutte le prove sono state fatte eseguendo da terminale per evitare problemi di percorsi relativi causati dai classpath dell'ide

    GRAZIE A TUTTI IN ANTICIPO

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Invece di usare getResource(), usa getResourceAsStream(), che ti restituisce un InputStream. Usa l'InputStream per leggere il file a blocchi di N byte, per poi scriverli dove ti pare con un FileOutputStream.


    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

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da LeleFT
    Invece di usare getResource(), usa getResourceAsStream(), che ti restituisce un InputStream. Usa l'InputStream per leggere il file a blocchi di N byte, per poi scriverli dove ti pare con un FileOutputStream.


    Ciao.
    Se si deve estrarre un solo file lo si può trattare come un'archivio zip, o mi sbaglio?
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Scara95
    Se si deve estrarre un solo file lo si può trattare come un'archivio zip, o mi sbaglio?
    Immagino di sì. Bisognerebbe verificare, però, che il sistema operativo permetta l'apertura del JAR e non lo consideri come "in uso"...

    Però non vedo come questa soluzione possa essere "migliorativa"... per estrarre una Entry si deve comunque ottenere un InputStream, leggere a blocchi di byte e scrivere su un FileOutputStream... c'è in più la complessità del trattamento delle Entry del file ZIP.


    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 L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Originariamente inviato da LeleFT
    Immagino di sì. Bisognerebbe verificare, però, che il sistema operativo permetta l'apertura del JAR e non lo consideri come "in uso"...


    Ciao.
    Ah certo, non ci avevo pensato!

    Ma hai la possibilità di estrarre un solo file.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it L'avatar di Josten
    Registrato dal
    Jan 2011
    Messaggi
    25
    ragazzi mi fate un esempio di come usarlo?
    inoltre considerando che il file da prendere peserà sui 80 kb ... quanto sarebbe il buffer ideale da usare?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Josten
    ragazzi mi fate un esempio di come usarlo?
    inoltre considerando che il file da prendere peserà sui 80 kb ... quanto sarebbe il buffer ideale da usare?
    La dimensione può essere qualunque... si preferiscono, chiaramente, i multipli di 2 (in generale, multipli di 1024 byte = 1K).

    Un esempio basilare come se ne trovano a centinaia su Internet:

    codice:
    InputStream is = null;
    FileOutputStream fos = null;
    try {
       // Ottengo l'InputStream della risorsa dentro il JAR
       is = getClass().getResourceAsStream("...");
    
       // Apro il file di output
       fos = new FileOutputStream("...");
    
       // creo il buffer + tutte le variabili necessarie ai controlli
       byte[] buffer = new byte[4096];   // 4KB vedi tu...
       int byteLetti = 0;
    
       // Leggo dallo stream
       while((byteLetti = is.read(buffer)) >= 0) {
          // scrivo i dati letti sul file
          fos.write(buffer, 0, byteLetti);
       }
    
       // Flusho
       fos.flush();
    } catch (Exception e) {
       e.printStackTrace();
    } finally {
       // Chiusura di tutti gli streams
       if (is != null) {
          try { is.close(); } catch (Exception e) { }
       }
       if (fos != null) {
          try { fos.close(); } catch (Exception e) { }
       }
    }
    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

  8. #8
    Utente di HTML.it L'avatar di Josten
    Registrato dal
    Jan 2011
    Messaggi
    25
    perfetto! grazie al tuo esempio MOOOOLTO utile sono riuscito a modificare quelle due variabili che mi servivano per trasformare il mio pezzo di codice che copiava e incollava in locale in uno che preleva dal jar come risorsa e lo scrive sempre nella stessa path desiderata ^^

    cmq per la cronaca ho chiesto a voi dell'esempio perchè oltre a sapere che era qualitativamete miglore, (o come diceva il mio prof, funziona xD) perchè ho cercato su google con chiavi come
    getResourceAsStream() exemple
    ma non ho trovato esempi che l'utilizzassero a dovere come qui sopra.. spero che questo topic sia utile a molti (è ricco di metatag )

    grazie tantissimo a tutti


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.