Toon posts:

[JAVA] ini bestand uitlezen, waarden -> array

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi

Ik heb dus zojuist een ini bestand aan gemaakt met de volgende layout:

code:
1
2
3
4
5
6
7
8
9
10
## - Please do not change the order     ##
## - distances given in metres  ##

[Circle]
Width : 8
Height : 8

[Ellipse]
Width : 4
Height : 8


Zoals te zien is heb ik diverse figuren waar ik waarden aan wil geven. Ik wil deze file dus met behulp van een functie uitlezen, maar wel zo, dat ik per "figuur" deze waarden kan onthouden. Dit leek mij het handigste in een Array te doen, omdat ik dit geheel dynamisch wil laten doen. Iemand moet dus bijvoorbeeld ook een figuur toe kunnen voegen.

Ik heb nu de volgende code voor het inlezen van de file:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void getFigureSettings() throws IOException, FileNotFoundException {
  int c = 0;
  ArrayList settings = new ArrayList();
  String regel;
  FileInputStream fileInput;
  BufferedReader data;
  try { 
       fileInput = new FileInputStream("settings.ini");
       data = new BufferedReader(new InputStreamReader(fileInput));
  }
  catch (FileNotFoundException fnfe) {
       throw fnfe;
  }
  try {
       while ((regel = data.readLine()) != null) {
       settings.add(regel);
       System.out.println(regel);
       }
  }
  catch (IOException ioex) {
       throw ioex;
  }
  fileInput.close();
}

Dit werkt naar behoren. De tekst in het bestand wordt netjes in de arraylist gezet. Nu alleen het uitlezen nog en het mag duidelijk zijn dat dit mijn probleem is. De attributen moeten per figuur zijn, ze moeten dus bijelkaar blijven. Ik heb tot nu toe de volgende code hiervoor:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void setFigureSettings() {
  try {
  int numObjects = countObjects();
  int i = 0;
  String figure;
  String attribute;
  figureSettings = new String[numObjects][2][1];
  Iterator iter = settings.iterator();
  while(iter.hasNext()) {
       String line = (String)iter.next();
       if (line.startsWith("[")) {
              int length = line.length();
              figure = line.substring(length-(length-1), length-1);
              System.out.println(figure);
       }
  }
  catch (Exception exc) {}  
}


Ik zit dus al met het feit dat ik niet dynamisch vectoren aan kan maken, dynamisch een naam aan de vector geven dus. Ik heb dus een array voorgedefinieerd. De variabele numObjects telt hoeveel figuren er zijn aan de hand van de [] om de figuren. Maar wat is nu de beste manier om de waarden van de atrributen van de figuren bij elkaar te houden, zodat ik met het tekenen van cirkels en/of andere figuren snel de waarden van de hoogte en breedte etc op kan halen?

Of heeft iemand een beter idee? Misschien dat iemand al eens met dit bijltje gehakt heeft? (ik wil dus de breedte en hoogte van figuren van buitenaf op kunnen geven)

Iemand?

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Ik neem aan dat de omschrijving van iedere figuur wel ongeveer hetzelfde is. Je kunt dan een class FigureDescription maken met de eigenschappen en die vervolgens in een HashMap gooien met de figuurnaam als key. Met hulp van de key heb je dan snelle toegang tot de eigenschappen van de figuur.
Als je het echt algemeen wilt houden, dan is het een hashmap in een hashmap gooien :)

Verwijderd

Topicstarter
SWfreak schreef op 13 november 2003 @ 10:42:
Ik neem aan dat de omschrijving van iedere figuur wel ongeveer hetzelfde is. Je kunt dan een class FigureDescription maken met de eigenschappen en die vervolgens in een HashMap gooien met de figuurnaam als key. Met hulp van de key heb je dan snelle toegang tot de eigenschappen van de figuur.
Als je het echt algemeen wilt houden, dan is het een hashmap in een hashmap gooien :)
Het moet in principe gewoon eenmaal deze waarden hebben, zodat ik bij het cirkels tekenen deze waarden op kan halen. Ik zal eens op zoek gaan naar wat info over die hashmap..

edit:

En ik lees net dat de volgorde van de waarden in de hashtable niet gegarandeerd hetzelfde blijft

[ Voor 10% gewijzigd door Verwijderd op 13-11-2003 10:57 ]


Verwijderd

Topicstarter
Hm, ik hoor net dat ik met eclipse van Sun eenvoudig een properties file aan kan maken. Iemand meer info hierover? Werkt het bijvoorbeeld snel en degelijk?

He is volgens mij niet onder runtime te wijzigen, in de zin van het veranderen van de waarden en het direct repainten van de cirkels met de vernieuwde waarden... Dit zou met een ini file wel makkelijk moeten kunnen..

---
[x-tra]

Okeej, ik heb de ini file veranderd naar het volgende:

code:
1
2
3
4
Circle_width : 5
Circle_height : 5
Ellipse_width : 4
Ellipse_height : 8


en met behulp van een stringtokenizer krijg ik dus per keer dat ik token (op : )
token 1 -> Circle_width
token 2 -> 5

en dit doe ik in een loop, dus telkens 2 tokens, 1 met naam , 2 is de value... Maar het opslaan van deze 2 gegevens kan dus niet in een array, en ik weet niet of een hashtable of hashmap veilig genoeg is voor deze klus...

Ik zoek even verder, maar mocht iemand een aan/op merking hebben over mijn idee, dan hoor ik dat graag.

[ Voor 46% gewijzigd door Verwijderd op 13-11-2003 12:11 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14:03

Robtimus

me Robtimus no like you

Kijk eens naar java.util.Properties.
Die kan files met regels in de vorm "key = value" perfect inlezen, en dan kan je met getProperty(key) of getProperty(key, default) de waarde inlezen.

Ik weet niet of hij ook andere vormen van regels aankan, en of hij wel goed met je [Circles] regel enzo goed overweg kan, maar desnoods kun je je ini file aanpassen.

Edit: net even getest met je ini file. De Properties.list() method geeft dit als uitvoer:
code:
1
2
3
4
5
-- listing properties --
Width=4
[Circle]=
[Ellipse]=
Height=8
Je dubbele keys worden dus niet opgenomen, en hij gaat idd niet goed om met je [Circle] etc regels. Niet geschikt dus zoals je ini file initieel was. Voor de tweede versie (met unieke keys en zonder de [] regels) werkt hij wel uitstekend.

Je kunt de keySet().iterator() gebruiken om er doorheen te lopen.

[ Voor 45% gewijzigd door Robtimus op 13-11-2003 12:30 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
waarom komt hier null uit:

Java:
1
2
3
4
5
while (st.hasMoreTokens()) {
    tokens[i] = st.nextToken().trim();
    i++;
}
figureProps.setProperty(tokens[0], tokens[1]);


want die setProperty regel mag blijkbaar niet...

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14:03

Robtimus

me Robtimus no like you

figureProps niet goed geinitialiseerd?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Java:
1
private Properties figureProps;


of moet je properties anders initialiseren? = null erachter maakt in ieder geval niks uit , maar dat leek me ook wel logisch..

omfg

new Properties() vergeten ;)

[ Voor 10% gewijzigd door Verwijderd op 13-11-2003 13:05 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14:03

Robtimus

me Robtimus no like you

Hoe ziet je ini file er nu uit? Allemaal in de vorm key : value ?
Waarom gebruik je dan nog een string tokenizer? De Properties.load(InputStream) method kan al het werk voor je doen.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
IceManX schreef op 13 november 2003 @ 13:13:
Hoe ziet je ini file er nu uit? Allemaal in de vorm key : value ?
Waarom gebruik je dan nog een string tokenizer? De Properties.load(InputStream) method kan al het werk voor je doen.
he? wie? wat? waar?

Mijn ini file is key : value nu ja en ik ben net blij dat ik dit aan het werk heb gekregen...
Ik zal in ieder geval een kijken naar wat je daar allemaal zegt :) misschien dat het sneller is ofzo ?

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

Verwijderd schreef op 13 november 2003 @ 13:17:
[...]


he? wie? wat? waar?

Mijn ini file is key : value nu ja en ik ben net blij dat ik dit aan het werk heb gekregen...
Ik zal in ieder geval een kijken naar wat je daar allemaal zegt :) misschien dat het sneller is ofzo ?
Als je je inifile de vorm key=value geeft, dan kan je gewoon zoiets doen:

Java:
1
2
Properties p = new Properties();
p.load(new FileInputStream("dinges.ini"));

TheStreme - Share anything with anyone


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14:03

Robtimus

me Robtimus no like you

Vladimir G. schreef op 13 november 2003 @ 13:52:
[...]

Als je je inifile de vorm key=value geeft, dan kan je gewoon zoiets doen:

Java:
1
2
Properties p = new Properties();
p.load(new FileInputStream("dinges.ini"));
Ik heb het getest, met key : value werkt het ook. Maar met een = is wel netter, omdat het meer standaard is dan met een :

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
IceManX schreef op 13 november 2003 @ 14:14:
[...]
Ik heb het getest, met key : value werkt het ook. Maar met een = is wel netter, omdat het meer standaard is dan met een :
dit betekend dus waarschijnlijk dat mijn functie voor het inlezen van het bestand ook overbodig is geworden...

al mijn werk voor niets :'(

hehe..

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

Verwijderd schreef op 13 november 2003 @ 14:19:
[...]


dit betekend dus waarschijnlijk dat mijn functie voor het inlezen van het bestand ook overbodig is geworden...

al mijn werk voor niets :'(

hehe..
Uhm...yup :) . Misschien een goeie les voor de volgende keer: zoek eerst de API goed door voordat je een redelijk standaard algoritme zelf gaat implementeren. Aan de andere kant heb je waarschijnlijk wel weer wat geleerd van zelf zoiets proberen te maken.

TheStreme - Share anything with anyone


Verwijderd

Topicstarter
Vladimir G. schreef op 13 november 2003 @ 14:48:
[...]

Uhm...yup :) . Misschien een goeie les voor de volgende keer: zoek eerst de API goed door voordat je een redelijk standaard algoritme zelf gaat implementeren. Aan de andere kant heb je waarschijnlijk wel weer wat geleerd van zelf zoiets proberen te maken.
Ja, ik heb inderdaad het openen, lezen verwerken enzo van bestanden wel weer bijgespijkerd, maargoed...

Op het moment dat je het echt nodig hebt zul je toch altijd zien dat je geen standaard vind... Maakt ook verder niet uit, kep nu eens met StringTokens etc gewerkt dus..

Maar bedankt voor de hulp !

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14:03

Robtimus

me Robtimus no like you

Verwijderd schreef op 13 november 2003 @ 14:19:
[...]


dit betekend dus waarschijnlijk dat mijn functie voor het inlezen van het bestand ook overbodig is geworden...

al mijn werk voor niets :'(

hehe..
och, zelf ook wel gedaan. Ik kwam pas later achter de JOptionPane, toen had ik de dialogs zelf al geschreven.

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1