Newsgroup: it.comp.java
Titolo: Gestione .INI ...

Esiste una classe che gestisce i file .INI fatti in questo modo:
[Sezione1]
voce1=valore1
voce2=valore2
[Sezione2]
voce1=valore3
voce2=valore4
?
La classe Properties gestisce solo voce=valore...
Ringrazio per le risposte
-- 
by \ \/ /\/
PerezDeQueya80 on AzzurraNET.org

 voce2=valore2
diventa
Sezione1_voce1=valore1
Sezione1_voce2=valore2
Mario

 Sezione1_voce2=valore2
Queste soluzioni le vorrei evitare in quanto nelle sezioni potrei avere 
qualsiasi carattere...


Piccolo appunto: il nome delle sezioni non le conosco, ma le voci che ci sono 
per ogni voce sì.
Inoltre ho provato già a fare qualche prova di lettura, ma le frasi in cui 
per esempio ci sono le è accentate mi esce fuori questo carattere "Þ" (spero 
si veda bene ma è tipo una P con la linguetta, superiore, al centro. Visto 
che oltre alle e accentate ho anche u accentate, e maiuscole accentate etc 
etc, come posso fare?


Ho cercato un bel po' su internet ma nulla... quindi me la sto scrivendo io.
Anche se rimane il problema dei caratteri accentati.
Ovviamente quando il tutto sarà pronto e testato, metterò il codice sorgente 
qui ;)



Bravo, ricordati anche di specificare una licenza :-)
Ciao D.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see 
http://www.gnupg.org
iD8DBQFAl+/G4bZBbJz82hMRApThAJ45mLLLI+axPAng9W2qLqY7GU90qQCgt5l0
MHWSJwEO77ZaoH0NAlMkEMM=
=Sg23
-----END PGP SIGNATURE-----

 Bravo, ricordati anche di specificare una licenza :-)
Ecco, sulla questione delle licenze ne so veramente poco :|
In questo caso cosa dovrei fare?


 In questo caso cosa dovrei fare?
La più idonea per questo tipo di lavori a mio avviso è la GPL
(
http://www.gnu.org/licenses/gpl.txt
) o la LGPL
(
http://www.gnu.org/licenses/lgpl.txt
).
Ne esistono molte altre di licenze, che puoi cominciare a guardare da qui
http://www.gnu.org/licenses/licenses.html
.
Queste sono le licenze (principali) per il sw libero.
Devi trovare quella che più ti si addice.
Ciao D.
Inviato da 
www.mynewsgate.net

 
http://www.gnu.org/licenses/licenses.html
.
Alla faccia... ma non posso mettere il codice dicendo semplicemente che vale 
quella licenza lě (riportando il link da te segnalato) e dire che non sarň 
responsabile dell'uso del codice esposto?


 responsabile dell'uso del codice esposto?
Se leggi fino in fondo, verso gli ultimi punti (forse proprio le ultime due
pagine), dice come applicare la licenza.
In genere devi mettere un "breve" testo, un link alla licenza intera e
poi il
codice.
Non è obbligatorio esporre una licenza, nè in particolare una GPL o
similari.
Solo che se metti la GPL per esempio dici he tutti posso prendere il
codice e
modificarlo purchè lo ridistribuiscano con tanto di sorgenti e non può
essere
usata dentro prodotti commerciali (mi pare).
Una cosa è certa. Metti per esempio che fai un codice che anche se non è
perfettamente funzionante, cmq è una buona base per una libreria
commerciale. Se
non specifichi la licenza, chiunque può appropriarsene, apportare le
modifiche
del caso e distribuire la libreria a pagamento dicendo che è farina del suo
sacco facendoci sopra pure i soldi.
Ciao D.
PS: Naturalmente nell'esempio ho estremizzato apposta ;-)
Inviato da 
www.mynewsgate.net

Bene, dopo le dritte sulle licenze del buon getting_out, pubblico la prima 
basilare versione per leggere i tipici file INI di windows.
Ovviamente potete (dovete ;)) avvisarmi di correzioni sull'inglese e su 
come il codice potrebbe essere più pulito.
Non mi assumo nessuna responsabilità sull'uso del codice di seguito 
esposto.
Il codice seguente (e tutte le varianti che sorgeranno in questo thread) è 
espressamente esposto secondo la licenza GPL (leggibile all'indirizzo 
http://www.gnu.org/licenses/gpl.txt
).
import java.util.HashMap;
import java.io.*;
/**
 * This class can read the typically Windows .INI files made in this mode:
 * [Section1]
 * key1=value1
 * key2=value2
 * [Section2]
 * key3=value3
 * key4=value4
 * key5=value5
 * ...
 *
 * @author PerezDeQueya80
 * @version 0.1
 * @since 05/05/2004
 */
public class WinIniReader {
  /**
   * All the String that may start a Comment
   */
  public static final String[] COMMENT_STRINGS = new String[] {
    "#", ";", "//", "'", "--"
  };
  private HashMap _sections;
  /**
   * The main constructor need the path of the file
   * and automatically load all contents of the file.
   *
   * @param filePath The file path.
   * @exception java.lang.Exception This constructor may throw
   * a java.io.FileNotFoundException if the file not exist or a
   * generic Exception when the file is not a valid windows INI
   * file.
   */
  public WinIniReader (String filePath) throws Exception {
    File file = new File(filePath);
    if (!file.exists()) throw new FileNotFoundException();
    _sections = new HashMap();
    BufferedReader br = new BufferedReader(
      new InputStreamReader(
        new FileInputStream(file)
        //, CharSet
      )
    );
    int line = 0;
    String section = null;
    HashMap keys = new HashMap();
    while (true) {
      line++;
      try {
        String sTmp = br.readLine();
        if (sTmp == null) break; // EOF
        if (sTmp.trim().length()==0) continue; // blank line
        if (isCommented(sTmp)) continue; // commented line
        // SECTION
        if (sTmp.startsWith("[") & sTmp.endsWith("]")) {
          // if start a section, need to close previous section
          if (section!=null) {
            this._sections.put(section, keys);
          }
          section = sTmp.substring(1,sTmp.length()-1);
          keys = new HashMap();
        }
        // KEY
        else {
          // else is a key=value
          int iPos = sTmp.indexOf("=");
          if (iPos==-1)
            throw new Exception
              ("No valid key=value in line " + line);
          String sKey = sTmp.substring(0,iPos);
          String sValue = sTmp.substring(iPos+1);
          keys.put(sKey, sValue);
        }
      }
      catch (IOException e) {
        // EOF
        break;
      }
    }
    // close previous section
    if (section!=null) {
      this._sections.put(section, keys);
    }
  }
  /**
   * Return a boolean if the string begin with one of the
   * COMMENT_STRINGS
   *
   * @param line The string to be processed
   * @return true if is commented else false
   */
  public static boolean isCommented (String line) {
    for (int i=0;i<COMMENT_STRINGS.length;i++) {
      if (COMMENT_STRINGS[i].equals(
        line.substring(0, COMMENT_STRINGS[i].length())
      ))
        return true;
    }
    return false;
  }
  /**
   * This class may be called as main whit the file as
   * arguments
   *
   * @param args Only a string that is the path of file
   * @exception java.lang.Exception
   */
  public static void main (String[] args) throws Exception {
    if (args.length == 1) {
      WinIniReader wi = new WinIniReader(args[0]);
      wi.list(java.lang.System.out);
    }
    else System.out.println("Usage: Ini filename.ini");
  }
  /**
   * This method print all the values to the PrintStream passed
   *
   * @param out The PrintStream
   */
  public void list (PrintStream out) {
    for (int i=0;i<this._sections.size();i++) {
      String sSect =
        (String)this._sections.keySet().toArray()[i];
      out.println("["+sSect+"]");
      HashMap hm = (HashMap)this._sections.get(sSect);
      for (int j=0;j<hm.size();j++) {
        String sKey = (String)hm.keySet().toArray()[j];
        String sVal = (String)hm.get(sKey);
        out.println(sKey+"="+sVal);
      }
    }
    out.println("Total sections: "+this._sections.size());
  }
  /**
   * This method return an Array of String with all Section in
   * the file
   */
  public String[] getSections() {
    String[] sTmp = new String[this._sections.size()];
    Object[] oTmp = this._sections.keySet().toArray();
    for (int i=0;i<oTmp.length;i++) {
      sTmp[i] = (String)oTmp[i];
    }
    return sTmp;
  }
  /**
   * This methot return an HashMap with all Key - Values of the
   * section passed.
   * If the section don't exist or is empty, the HashMap will
   * be empty.
   *
   * @param section
   */
  public HashMap getValues(String section) {
    return (HashMap)this._sections.get(section);
  }
  /**
   * This methot return a String[][] array with all
   * Key - Values of the section passed.
   * If the section don't exist or is empty, the array will be
   * empty.
   *
   * @param section
   */
  public String[][] getArrayValues(String section) {
    HashMap hm = this.getValues(section);
    String[][] sTmp = new String[hm.size()][2];
    for (int i=0;i<hm.size();i++) {
      sTmp[i][0] = (String)hm.keySet().toArray()[i];
      sTmp[i][1] = (String)hm.get(sTmp[i][0]);
    }
    return sTmp;


Devo modificarlo... se ci sono due sezioni uguali non le riesco a vedere... 
daltronde usanto l'hashmap me la dovevo aspettare... :(


 
Qualcuno puņ aiutarmi? :(



Non capisco questo problema che ti vuoi creare a tutti i costi.
Java utilizza i .properties scritti in un certo modo.
Perchč ostinarsi e fargli leggere un .ini scritto cosě?

 Perchč ostinarsi e fargli leggere un .ini scritto cosě?
L'ho scritto prima, perché windows (e ci sono proprio delle funzioni 
dell'API) gli ini li scrive in questo modo.
