Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
DEEBOT T90 PRO OMNI abbina un sistema di aspirazione basato su tecnologia BLAST ad un rullo di lavaggio dei pavimenti dalla larghezza elevata, capace di trattare al meglio le superfici di casa minimizzando i tempi di lavoro. Un robot completo che riesce anche ad essere sottile e garantire automazione ed efficienza nelle operazioni di pulizia di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-11-2008, 10:54   #1
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
[JAVA] Usare un file di configurazione stile Unix/Linux per le nostre applicazioni

Salve a tutti,

nella mia applicazione mi sono trovato ad aver bisogno di un file di configurazione, che sia accessibile in lettura/scrittura sia dalla mia interfaccia grafica, sia ovviamente editandolo con un editor di testi.

Dal momento che è la prima volta che mi capita una cosa del genere vorrei chiedervi un consiglio: uso un normalissimo file di configurazione come si fa su Linux o XML?

Nel primo caso, dovrei scrivermi una buona parte di codice che interpreti se la riga è un commento o no; dovrebbe prendere ogni singola riga e fare il parsing delle stringhe, del tipo NOME_PARAMETRO="valore", catturando solo il valore in corrispondenza di un dato parametro richiesto ecc..
Siccome ho visto che questa cosa è abbastanza elaborata ho pensato a XML che mi sembra più indicato per questo genere di cose.

Facendo qualche ricerca ho trovato questo.
Non so però, se è esattamente quello che sto cercando.

Qualcuno può illuminarmi?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 12:39   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Se il tuo file di configurazione non è troppo articolato penso possa bastare un semplice file di testo senza scomodare XML e librerie varie per parserizzarlo.

Magari se fai un esempio del file di config si può capire meglio se ti serva proprio XML o se invece sia più semplice gestire tutto con un file di testo.

Considera che se devi solo riconoscere una riga commentata da una valida, e quella valida è sempre e solo strutturata come una coppia "Nome Parametro", "Valore" imho ti basta il file di testo da parserizzare da te.

In Java c'è la classe Scanner che potrebbe tornarti utile.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 12:47   #3
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Dunque, vorrei usare il file xml in previsione di ulteriori estensioni e ora il file è molto semplice.

Codice:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <server-host>localhost</server-host>
</configuration>
Non riesco a capire come tirar fuori il valore localhost usando le librerie che ho importato.

C'è anche un esempio quì.
Ovvero:
Codice:
ConfigurationFactory factory = new ConfigurationFactory("config.xml");
Configuration config = factory.getConfiguration();
Però poi quando vado a fare:
Codice:
System.out.println(config.getString("configuration.server-host"))
Ottengo sempre NULL!!!

La cosa mi interessa parecchio, quindi opterei per questa soluzione.
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 12:52   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
Dunque, vorrei usare il file xml in previsione di ulteriori estensioni e ora il file è molto semplice.
Nulla da ridire sulle tue scelte ma hai mai sentito parlare di YAGNI?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 12:56   #5
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Si conosco bene questa filosofia, grazie.

Ora però sto cercando di capire come usare questo Configuration di org.apache.

Ho notato che facendo un
Codice:
config.setProperty("configuration.server-host", "localhost");
effettivamente poi quando vado a fare
Codice:
System.out.println(config.getString("configuration.server-host"))
Ottengo localhost!

Quindi in un certo senso funziona. Solo non capisco perché effettivamente il file non viene usato! E' come se usasse un file XML in memoria, e non usasse il vero file xml che ho messo nella root del progetto. Però di fatto lo vuole in input come ho scritto prima!
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 13:03   #6
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
è inutile complicarti la vita in quel modo.
usa questo:
http://java.sun.com/javase/6/docs/ap...roperties.html
Volendo puoi anche scrivere le properties direttamente in XML con i metodi loadFromXML(InputStream) e storeToXML(OutputStream, String, String), ma io ti consiglio il normale file di testo.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 13:30   #7
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Grazie!
Porca miseria! E pensare che la classe Properties l'avevo già usata in un corso universitario per gli EJB.

Ora vedo che cosa si può fare.

EDIT: ho risolto prendendo spunto da questo esempio.
Spero possa essere utile anche ad altri.
Grazie a tutti ancora.
__________________
^ThE CyBoRg^

Ultima modifica di fbcyborg : 06-11-2008 alle 14:43.
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 15:23   #8
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
è meglio non usare il FileInputStream per accedere alle properties ma il resourcebundle o il getResourceAsStream come in questo esempio:
http://www.javaworld.com/javaworld/j...ty.html?page=2
In questo modo non si è vincolati al filesystem, ma si utilizza direttamente il classloader della VM.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 15:30   #9
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Mi sembra un po' complicato l'esempio in fondo alla pagina.

Gentilmente, potresti mostrarmi come faresti tu, adattando il codice che ho linkato io, con quello che hai detto tu?

Grazie!
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 15:47   #10
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
Mi sembra un po' complicato l'esempio in fondo alla pagina.

Gentilmente, potresti mostrarmi come faresti tu, adattando il codice che ho linkato io, con quello che hai detto tu?

Grazie!
basta usare questo nel metodo readProperties:
Codice:
properties.loadFromXML(Class.getResourceAsStream ("/some/pkg/configuration.xml"));
ovviamente mettendo al posto di some e di pkg il nome dei tuoi package in cui c'è il file di config
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2008, 16:06   #11
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Guarda, c'ho provato ma non funziona.
Da sempre problemi sul fatto che non posso chiamare un metodo statico in un contesto non statico o viceversa, ora non ricordo bene.

So bene che quanto lamenta il compilatore è corretto! Ci mancherebbe. Solo che evidentemente non riesco a rimettere bene le cose a posto nel mio contesto.

Ora il problema è un altro.
Quello che mi serve di fare è, caricare una certa proprietà in base alla chiave, mostrarla in una JLabel e dare la possibilità di modificare il valore in questione nel file di configurazione xml.
Fino a quì ci sono... Prelevo il valore in base alla chiave con:
Codice:
jLabel4.setText(properties.getProperty("server-host"));
Poi do la possibilità all'utente di modificare quel valore, tramite un JButton.
Nell'actionPerformed del JButton faccio:
Codice:
properties.setProperty("server-host", host);
Dove host è la variabile di tipo String che contiene il nuovo valore.
Successivamente, dovrò aggiornare il mio file config.xml e quindi ho pensato "bene" di dare la seguente istruzione:
Codice:
properties.store(new FileOutputStream("config.xml"), null);
Il problema è che me lo cancella tutto e me lo riformatta come gli pare a lui, togliendo tutta la struttura del file xml, ovvero:
Codice:
#Thu Nov 06 16:06:22 GMT+01:00 2008
server-host=nuovoValore
Come faccio a dirgli che invece deve modificare solo il necessario andando a modificare solo il valore e non tutto il file?

EDIT: ho trovato l'errore. Dovevo usare storeToXML() anziché store().
__________________
^ThE CyBoRg^

Ultima modifica di fbcyborg : 06-11-2008 alle 16:38.
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 12:24   #12
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
E' normale che il mio file xml, dopo esser stato modificato via software, perda l'indentazione?

In caso, com'è possibile fare in modo che non la perda?
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 12:34   #13
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
E' normale che il mio file xml, dopo esser stato modificato via software, perda l'indentazione?

In caso, com'è possibile fare in modo che non la perda?
ehmm..
che intendi con "modificato via software"?
con cosa l'hai modificato?
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 12:54   #14
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Intendo quando faccio un setProperty e uno store tramite un oggetto Properties.
In questo modo vado a modificare un determinato valore in base alla chiave passata e poi applico le modifiche su file con lo store(). Proprio come ho detto un paio di post fa.

Inizialmente il mio file xml era ben indentato. Una volta che ho dato lo "store" ha perso l'indentazione.

NB: questo non mi crea problemi di funzionalità, anzi.. tutt'altro. Mi interessava solo per migliorare la leggibilità qualora ce ne fosse la necessità di modificare tale file a mano.
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 13:14   #15
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da fbcyborg Guarda i messaggi
Intendo quando faccio un setProperty e uno store tramite un oggetto Properties.
In questo modo vado a modificare un determinato valore in base alla chiave passata e poi applico le modifiche su file con lo store(). Proprio come ho detto un paio di post fa.

Inizialmente il mio file xml era ben indentato. Una volta che ho dato lo "store" ha perso l'indentazione.

NB: questo non mi crea problemi di funzionalità, anzi.. tutt'altro. Mi interessava solo per migliorare la leggibilità qualora ce ne fosse la necessità di modificare tale file a mano.
boh..
non mi pare che lo storeToXml permetta di specificare se mantenere l'indentazione come fanno i parser...
Al limite potresti leggere il file con un parser decente e riscriverlo con la formattazione corretta.
Però, secondo me, la scelta migliore in questo caso è fare uno store su un file .properties di testo e memorizzare le informazioni come coppia chiave valore che è il metodo in assoluto + leggibile
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 13:20   #16
fbcyborg
Senior Member
 
L'Avatar di fbcyborg
 
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
Ok, ti ringrazio. Pazienza se non è possibile!
__________________
^ThE CyBoRg^
fbcyborg è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
ARCTIC Senza AI 370: il PC 'sotto la scr...
Corsair 3200D, il mid-tower sotto i 100€...
Esiste un SSD NVMe M.2 2280 da 16 TB, ma...
Speciale LEGO in sconto su Amazon: set d...
Il citofono si evolve: ecco le novit&agr...
MindsEye cambia rotta: Build A Rocket Bo...
Offerte Amazon in tempo reale: i miglior...
Ecco come potrebbe apparire Project Heli...
Carl Pei immagina un futuro senza app: g...
Google lancia il "vibe design"...
NVIDIA non ha intenzione, almeno per ora...
Recensione Realme 16 Pro+ 5G: la fascia ...
FBI, ammesso l'acquisto di dati privati:...
Realme 16 Pro e 16 Pro+ in evidenza: car...
I prossimi mid-range di Samsung utilizze...
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: 14:26.


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