Torna indietro   Hardware Upgrade Forum > Software > Programmazione

TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Dal richiamo di Enrico Letta alla necessità di completare il mercato unico entro il 2028 alla visione di Nokia sul ruolo dell’IA e delle reti intelligenti, il Nokia Innovation Day 2025 ha intrecciato geopolitica e tecnologia, mostrando a Vimercate come la ricerca italiana contribuisca alle sfide globali delle telecomunicazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-10-2007, 11:33   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
[Java] estrarre dal proprio JAR

immaginiamo di poter dare per scontato che un programma Java sia stato compresso in un file JAR assieme ad alcune risorse che dovrà utilizzare (facciamo delle immagini). i problemi che vedo sono principalmente due:
1) come ottenere il path del proprio file JAR
2) come estrarre dal JAR (questo è un problema solo mio, nel senso che so che si può fare a non so come ^^)

ed infine aggiungiamo anche un terzo problema:
3) esiste una maniera più semplice/diretta/affidabile? per esempio, in Win32 per caricare delle risorse dal proprio eseguibile non c'è mica bisogno di sapere il nome del file e di aprirlo a parte...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 11:56   #2
Guille
Member
 
L'Avatar di Guille
 
Iscritto dal: Dec 2004
Città: Una palla di fango abitata da scimmie sognatrici
Messaggi: 128
Quote:
Originariamente inviato da 71104 Guarda i messaggi
immaginiamo di poter dare per scontato che un programma Java sia stato compresso in un file JAR assieme ad alcune risorse che dovrà utilizzare (facciamo delle immagini). i problemi che vedo sono principalmente due:
1) come ottenere il path del proprio file JAR
2) come estrarre dal JAR (questo è un problema solo mio, nel senso che so che si può fare a non so come ^^)

ed infine aggiungiamo anche un terzo problema:
3) esiste una maniera più semplice/diretta/affidabile? per esempio, in Win32 per caricare delle risorse dal proprio eseguibile non c'è mica bisogno di sapere il nome del file e di aprirlo a parte...
Guardati i metodi getResource() e/o getResourceAsStream() di Class.
__________________
"Contro la stupidità gli stessi dei lottano invano" Friedrich Schiller
"Chi rinuncia alla libertà per raggiungere la sicurezza non merita né la libertà né la sicurezza" Benjamin Franklin
"Guardati dalla furia di un uomo tranquillo" John Dryden
Guille è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:10   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
pare faccia al caso mio, però parla di risorse associate ad una classe; come si associa una risorsa ad una classe? una risorsa associata ad una classe può stare anche dentro un JAR?

lavoro con Eclipse e quando esporto i JAR mi permette di includervi anche cartelle non contenenti files binari .class. io ho messo tutte le mie immagini in una cartella "gfx", che nel filesystem si trova allo stesso livello delle cartelle "src" e "bin" in cui Eclipse mette di default i sorgenti e i binari (rispettivamente), quindi come procedo esattamente? va bene includere "gfx" nel JAR o devo includere separatamente le immagini in qualche altro modo? cosa passo poi di preciso a getResource(AsStream)?

altra domanda: vedo che getResource mi restituisce un URL... sarebbe l'URL di cosa? si, della risorsa, ok , ma sto URL a cosa punta? a una cartella temporanea nel filesystem locale dove la JVM ha estratto i files? o che altro?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:42   #4
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da 71104 Guarda i messaggi
pare faccia al caso mio, però parla di risorse associate ad una classe; come si associa una risorsa ad una classe? una risorsa associata ad una classe può stare anche dentro un JAR?

lavoro con Eclipse e quando esporto i JAR mi permette di includervi anche cartelle non contenenti files binari .class. io ho messo tutte le mie immagini in una cartella "gfx", che nel filesystem si trova allo stesso livello delle cartelle "src" e "bin" in cui Eclipse mette di default i sorgenti e i binari (rispettivamente), quindi come procedo esattamente? va bene includere "gfx" nel JAR o devo includere separatamente le immagini in qualche altro modo? cosa passo poi di preciso a getResource(AsStream)?

altra domanda: vedo che getResource mi restituisce un URL... sarebbe l'URL di cosa? si, della risorsa, ok , ma sto URL a cosa punta? a una cartella temporanea nel filesystem locale dove la JVM ha estratto i files? o che altro?
Ogni risorsa messa all'interno di un file .jar può essere caricata utilizzando il classloader.
Il path non è altro che il percorso della risorsa espresso in termini di package.
Per esempio se hai un'immagine nella dir gfx/pamela.jpg basta che dici al classloader di darti la risorsa 'gfx/pamela.jpg' e provvede lui a fare tutto.
Stai attento alle varie modalità possibili per accedere ai package perchè puoi accedervi sia in maniera relativa che assoluta.
Una pagina web che spiega piuttosto bene tutto il meccanismo è questa:
http://www.javaworld.com/javaworld/j...ty.html?page=2
Nonostante sia stata scrtta per il caricamento delle properties spiega bene le differenze tra i 3 metodi:
Codice:
  ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
  Class.getResourceAsStream ("/some/pkg/resource.properties");
  ResourceBundle.getBundle ("some.pkg.resource");
Ovviamente però l'ultimo metodo funziona solo con file .properties mentre gli altri sono assolutamente generali
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:49   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ok, funziona perfettamente
adesso ho un altro problema: non funziona più se eseguo le classi non compresse, per esempio lanciando java o javaw da un bat oppure lanciando il programma da Eclipse. è possibile scrivere del codice indipendente dal formato del bundle (jarrato o semplice ramo di directories) che carichi o decomprima (a seconda) le immagini dalla cartella gfx?

ps: lol, pamela.jpg
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:50   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ecco, dimenticavo: non funziona perché la getResourceAsStream mi lancia una IllegalArgumentException che vorrei evitare di catturare perché non sarebbe codice indipendente dal formato del bundle
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:53   #7
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da 71104 Guarda i messaggi
ecco, dimenticavo: non funziona perché la getResourceAsStream mi lancia una IllegalArgumentException che vorrei evitare di catturare perché non sarebbe codice indipendente dal formato del bundle

ma vedi che quel codice funziona indipendentemente dal fatto che i tuoi files siano sentro un jar o no.
L?importante è che la struttura della directory sia visibile al tuo class loader.
Se ad esempio fai partire il tuo codice dalla directory classes e hai le risorse in una cartella resources è sufficiente che aggiungi al tuo classpath anche la cartella resources e tutto va a meraviglia

P.S. e mi raccomando di non dimenticarti il disclaimer per impedire l'uso del tuo programma ai minori di anni 18 quando riesci finalmente a caricare il file pamela.jpg



ARI-EDIT:
tanto per essere + chiaro in una situazione reale probabilmente hai questa situazione:
Codice:
    base-dir
    |      |
    |      |
classes resources
In quel caso se inserisci la directory basedir nel tuo classpath puoi accedere ai tuoi file usando il percorso "resources/gfx/pamela.jpg" che presumo manterrai anche nel tuo jar.
Altrimenti, se inserisci la cartella resources nel classpath al posto di base-dir, nel tuo jar devi omettere quella cartella e comprimere semplicemente la cartella gfx con tutto il suo contenuto ( ) altrimenti quando andrai ad accedervi con il path "gfx/pamela.jpg" nel .jar ti ritrovi la directory resources nel mezzo e quindi ti sballa tutto
spero di essere stato un pò + chiaro ora
__________________

Ultima modifica di ^TiGeRShArK^ : 23-10-2007 alle 12:59.
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:56   #8
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi

ma vedi che quel codice funziona indipendentemente dal fatto che i tuoi files siano sentro un jar o no.
L?importante è che la struttura della directory sia al di sopra di quella di partenza del tuo class loader.
Se ad esempio fai partire il tuo codice dalla directory classes e hai le risorse in una cartella resources è sufficiente che aggiungi al tuo classpath anche la cartella resources e tutto va a meraviglia
aaaaaaaah è vero, il cavolo di classpath! ora provo...

Quote:
P.S. e mi raccomando di non dimenticarti il disclaimer per impedire l'uso del tuo programma ai minori di anni 18 quando riesci finalmente a caricare il file pamela.jpg

e ti pareva che andavamo avanti co sta cazzata
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:02   #9
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da 71104 Guarda i messaggi
aaaaaaaah è vero, il cavolo di classpath! ora provo...
dai un'occhio al mio edit successivo altrimenti tra 5 minuti torni a bestemmiare qui sul forum
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:05   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
dai un'occhio al mio edit successivo altrimenti tra 5 minuti torni a bestemmiare qui sul forum
infatti stavo giusto scrivendo quando mi son visto spuntare il Gmail Notifier che mi avvisava della nuova risposta nella discussione sottoscritta (visto che organizzazione? )

comunque non capisco, dovrebbe essere tutto regolare ma non carica ste immagini... fammici sbattere ancora un po' e poi torno a bestemmiare
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:18   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
torno a bestemmiare

allora, io ho la cartella del mio progetto contenente le seguenti tre cartelle:
  • bin, contenente i .class
  • gfx, contenente le immagini
  • src, contenente i sorgenti .java

sapendo che voglio caricare le immagini in questo modo:
Codice:
UnaMiaClasse.class.getResourceAsStream("/gfx/" + nomeFileImmagineConAncheEstensione);
quale classpath devo impostare in Eclipse?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:44   #12
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da 71104 Guarda i messaggi
torno a bestemmiare

allora, io ho la cartella del mio progetto contenente le seguenti tre cartelle:
  • bin, contenente i .class
  • gfx, contenente le immagini
  • src, contenente i sorgenti .java

sapendo che voglio caricare le immagini in questo modo:
Codice:
UnaMiaClasse.class.getResourceAsStream("/gfx/" + nomeFileImmagineConAncheEstensione);
quale classpath devo impostare in Eclipse?
".", ovvero la directory base del tuo progetto, come avevo scritto nell'edit
solo che mi sa che in eclipse non te lo fa fare così ad occhio
quindi creati una cartella resources in cui copi la tua cartella gfx e aggiungi resources al classpath

__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:47   #13
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ma veramente io vado dove mi permette di impostare i "VM arguments"... là posso scrivere qualunque cosa. ho provato a metterci:
Codice:
-cp .
Codice:
-cp ./
ma sinceramente mi sembrano un tantinello inutili... anche perché non va con nessuno dei due
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 14:08   #14
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da 71104 Guarda i messaggi
ma veramente io vado dove mi permette di impostare i "VM arguments"... là posso scrivere qualunque cosa. ho provato a metterci:
Codice:
-cp .
Codice:
-cp ./
ma sinceramente mi sembrano un tantinello inutili... anche perché non va con nessuno dei due
ho provato e se lo copi sotto resources o una qualche altra cartella e aggiungi quella al classpath funge perfettamente
Codice:
public class ProvaLoad {

	public ProvaLoad() {
		InputStream inputStream = ProvaLoad.class.getResourceAsStream("/gfx/xxx/pam.jpg");
		if(inputStream != null) {
			System.out.println("non è null");
			InputStreamReader isreader = new InputStreamReader(inputStream);
			BufferedReader reader = new BufferedReader(isreader);
			try {
				System.out.println(reader.readLine());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
se passi l'opzione -cp . direttamente da eclipse sinceramente non so che effetto può avere dato che gli stai passando la directory base del suo progetto... e non ho idea se eclipse fa qualche controllo particolare, ma presumo di si dato che se provi ad aggiungere la directory stessa del progetto nel classpath ti bestemmia in aramaico e non te lo fa fare
quindi fai 'sta copia e non ti stressare
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 14:16   #15
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
a dire il vero a me non funziona mica eh... :|
basta, ci rinuncio: quando faccio il debug me lo tengo senza icone, e le icone le vedrò solo nel jar finale. tanto ormai sto programma l'ho quasi finito
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 14:20   #16
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da 71104 Guarda i messaggi
a dire il vero a me non funziona mica eh... :|
basta, ci rinuncio: quando faccio il debug me lo tengo senza icone, e le icone le vedrò solo nel jar finale. tanto ormai sto programma l'ho quasi finito
ma come no cazz?
io l'ho fatto in 3 secondi e ho semplicemente aggiunto al classpath la cartella gfx e quindi accedevo ai file usando il percorso /xxx/pam.jpg
Nel caso in cui devi mantenere la cartella gfx nel percorso basta che crei una cartella resources, copi la tua cartella gfx li sotto e aggiungi la cartella resources nel classpath.
E poi controlli che il tuo codice sia quanto meno simile a quello che ho postato
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Zuckerberg risponde agli investitori: 'B...
Il telescopio spaziale James Webb ha oss...
Warren Buffett scarica BYD dopo 17 anni,...
VodafoneThree UK sceglie Ericsson per po...
Ha costruito un 'aim assist' che d&agrav...
Metallo liquido o pasta termica? Nessuno...
DEEBOT T30C OMNI: il robot che aspira, l...
Scarica un gioco su Steam e perde 32mila...
OPPO offre uno dei migliori servizi clie...
The Mandalorian and Grogu: il trailer ch...
Da Schneider Electric nuovi design di ri...
Il nuovo iPhone pieghevole sarà c...
40 anni fa un bug software costò ...
Amazon inarrestabile: 27 offerte folli c...
Addio a Tom Matano, il designer che ha d...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v