Toon posts:

[java] instellingen in extern bestand

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik wilde bepaalde instellingen en berichten in een extern bestand hebben en die dan in mijn classes gebruiken.
zodat ik niet iedere keer als ik bijvoorbeeld een bericht moet aanpassen alle classes opnieuw moet compileren maar dat ik gewoon dat bestand aan pas.

Het geheel draaid op een webserver(tomcat), ik wil dat configuratie bestand dus in mijn jar hebben of in de lib directorie erbij. (dus dat men via internet niet dat bestand kunnen bekijken)

weet iemand een goede oplossing?
(dus geen script request.. ;) )

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

* ACM WEET dat er een speciale standaard klasse voor is...

Maar ik ben de naam vergeten |:(
Even kijken of ik het kan vinden VOOR iemand het post ;)

[edit]
Owja, die heet gewoon Properties :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je kunt de file inderdaad gewoon in de jar zetten. Je kunt een URL of InputStream naar de file verkrijgen met
code:
1
getClass().getClassLoader().getResource("blaat.dat");

In dit geval met blaat.dat in dezelfde dir staan als het package van je klasse.

Als je er een / voor zet, moet hij in de root staan:
code:
1
getClass().getClassLoader().getResource("/blaat.dat");

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
ACM: Owja, die heet gewoon Properties :)
Je kan inderdaad Properties gebruiken, maar die moet je uiteraard wel voeden met een InputStream :) . Met wat ik hierboven beschrijf kan je dus aan die InputStream komen.

De Properties implementatie gaat uit van een bestanden met eenvoudige "name=value" paren. Uiteraard kan je echter ook een eigen formaat of bijvoorbeeld XML gebruiken :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

eigen formaat of XML

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


  • Genius2000
  • Registratie: Februari 2001
  • Laatst online: 05-12-2025
je moet gebruik maken van property files.

landen.properties (werkt met key, values)
BE=België
NL=Nederland
...

import java.util.*;
public class Test99 {

public static void main(String[] args) {

ResourceBundle bundle = ResourceBundle.getBundle("landen", Locale.getDefault());

String land = bundle.getString("BE");
System.out.println (land); // geeft België
}
}

Veel plezier
Genius

btw: is handig een handige methode als je meerdere talen wil ondersteunen!

Verwijderd

Topicstarter
ok
dus ik maak een fileinputstream met
code:
1
getClass().getClassLoader().getResource("blaat.dat");

als parameter

en die fileinputstream neem ik dan als input in properties.

top, thanks!.. :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
webskipper: dus ik maak een fileinputstream met
Als je gelijk een stream wilt moet je nog even AsStream er echter zetten, anders krijg je een URL :) . Zie de API docs van ClassLoader ...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Op vrijdag 25 januari 2002 16:11 schreef mbravenboer het volgende:
Je kunt de file inderdaad gewoon in de jar zetten. Je kunt een URL of InputStream naar de file verkrijgen met
code:
1
getClass().getClassLoader().getResource("blaat.dat");

In dit geval met blaat.dat in dezelfde dir staan als het package van je klasse.

Als je er een / voor zet, moet hij in de root staan:
code:
1
getClass().getClassLoader().getResource("/blaat.dat");
M'n jar file staat dus in de lib directory.
Is die root dan de lib directory.
Of is het in de root van de jar file?

edit:

De file moet dus niet in de jar erbij staan..

Verwijderd

Topicstarter
^mbravenboer???^

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
webskipper: ^mbravenboer???^
Oh, had je niet gezien...

Root is ten opzicht van de root van je jar ... :)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
thanks,

't is gelukt.
dus met die filestream en dat getClass.
top!... :)

  • JapJap
  • Registratie: Maart 2001
  • Laatst online: 07-01 11:02
Ik las dat je Tomcat gebruikt. Als je de parameters in een servlet wilt gebruiken kan je ook gebruik maken van de web.xml file in de WEB-INF directory van de servlet:
code:
1
2
3
4
5
<servlet>
  <servlet-name>TestServlet</servlet-name> 
  <param-name>parameter1</param-name> 
  <param-value>test</param-value> 
</servlet>

De parameters kan je dan zo opvragen in je servlets (even uit 't hoofd):
code:
1
2
  ServletContext sc = ServletConfig.getServletContext()
  sc.getInitParameter("parameter1")

Misschien dat je hier wat aan hebt...

Verwijderd

Topicstarter
thanks, goed da'k 't weet. ik heb het in dit geval niet meer nodig maar ik kan dit zeker goed gebruiker voor andere sites... :)

Verwijderd

Probeer anders deze es

Constructor:
code:
1
 INIReader in = new INIReader("jefile.ini");

je ini file moet volgende structuur hebben
operator=value

dus bijv. :
ip=127.0.0.1

dan krijg je door
code:
1
 in.getEntry("ip")

de waarde 127.0.0.1 terug, of, als hij niet in de ini file voorkomt, null.

Tres simple...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.*;

public class INIReader
{   private String [] entries = new String [5];
    private String [] values = new String [5];

    int pos = 0;

    public INIReader(String filename)
    {   try
        {   BufferedReader in = new BufferedReader(new FileReader(filename));
            String input = "";
            while((input = in.readLine()) != null)
            {   if(input.indexOf("=") != -1)
                {   entries[pos] = input.substring(0,input.indexOf("="));
                    values[pos] = input.substring(input.indexOf("=")+1, input.length());
                    pos ++;
                    if(pos > entries.length)
                        xPand();
                }
            }
        }
        catch(Exception e)
        {
        }
    }

    private void xPand()
    {   String [] bck1 = new String [entries.length + 5];
        String [] bck2 = new String [entries.length + 5];
        for(int i = 0; i < entries.length; i++)
        {   bck1[i] = entries[i];
            bck2[i] = values[i];
        }
        entries = bck1;
        values = bck2;
    }

    public String getEntry(String name)
    {   for(int i = 0 ; i < entries.length; i++)
        {   if(entries[i].equalsIgnoreCase(name))
            {   return values[i];
            }
        }
        return null;
    }
}

Misschien heb je er wat aan... ;)

Verwijderd

Op vrijdag 25 januari 2002 16:16 schreef limoentje het volgende:
eigen formaat of XML
stel ik wil mijn properties in xml formaat in het bestand opslaan, kan dit dan ook met de Properities class?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
SurfingFromAM2PM: stel ik wil mijn properties in xml formaat in het bestand opslaan, kan dit dan ook met de Properities class?
Ja, maar je gebruikt het dan slechts als structuur vergelijkbaar met een HashMap. Je moet dus zelf code schrijven om de XML file in te lezen. Dit kan op twee manieren:

1. Transformeer met een simpele XSLT stylesheet naar het properties formaat.

2. Een eigen inlees-routine mbv bijvoorbeeld SAX.

Het laatste is zeer eenvoudig. Als je formaat er zo uit ziet:
code:
1
2
3
4
5
<properties>
   <property name="naam1" value="waarde1"/>
   <property name="naam2" value="waarde2"/>
   <property name="naam3" value="waarde3"/>
</properties>

Heb je alleen maar dit stukje code nodig:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class PropertyHandler extends DispatchingContentHandler
{
     private Properties properties;

     public PropertyHandler(Properties properties)
     {
       super();
       this.properties = properties;
     }

     public void startProperty(Attributes atts)
     {
       String key = atts.getValue("key");
       String value = atts.getValue("value");

       properties.setProperty(key, value);
     }
}

Je moet dan alleen mij nog even om de DispatchingContentHandler vragen :) . Deze maakt het gebruik van SAX iets eenvoudiger.

De eerste oplossing heeft overigens ook wel iets charmants. Je hoeft dan geen eigen inlees-code te schrijven en de XSLT stylesheet is heel simpel en duidelijk.

Er is nog een oplossing, maar die verklap ik pas over ongeveer 2 maanden :+ .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
De DispatchingContentHandler staat online:

http://www.pandoramix.org/software/DispatchingContentHandler.java

Enige ervaring met SAX is wel goed, maar de code hierboven zou in ieder geval gewoon moeten werken.

Wat doet deze handler? Heel simpel: SAX roept normaal gesproken twee methoden aan: startElement en endElement. In een parameter zit dan de element naam (bijvoorbeeld property). De DispatchingContentHandler verandert dit in een aanroep naar de methode startProperty(Attributes atts). Zoals je ziet worden tag-namen omgezet naar hoofdletters. Als je een - opneemt in de tagnaam wordt het streepje weghaalt en de eerste letter erna wordt dan een hoofdletter.

Veel plezier :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Ik heb een vraag die aansluit bij de TS. Ik heb een applicatie in een .jar zitten. Nu heb ik ook een .ini bestand waarin een aantal variabelen staan. Dit .ini bestand wil ik echter buiten de .jar hebben. Maar momenteel kan ik dit alleen voor elkaar krijgen door een hardcoded path op te nemen. Wat ik zou willen weten is hoe ik de map bepaal waarin mijn .jar staat. Ik wil namelijk dat ik de .jar kan kopieren naar een andere map (met een andere .ini) en dat hij dan meteen werkt!

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Deddiekoel schreef op 19 oktober 2004 @ 11:12:
Ik heb een vraag die aansluit bij de TS. Ik heb een applicatie in een .jar zitten. Nu heb ik ook een .ini bestand waarin een aantal variabelen staan. Dit .ini bestand wil ik echter buiten de .jar hebben. Maar momenteel kan ik dit alleen voor elkaar krijgen door een hardcoded path op te nemen. Wat ik zou willen weten is hoe ik de map bepaal waarin mijn .jar staat.
Niet.. Als je een file uit een jar wilt laden moet je de classloader (de gene die verantwoordelijk is geweest voor het inladen van de classes uit die jar) om een inputstream naar die file toe vragen.

Foo.class.getClassloader().getResourceAsStream(String name)
Ik wil namelijk dat ik de .jar kan kopieren naar een andere map (met een andere .ini) en dat hij dan meteen werkt!
Kun je niet werken met een working dir?

applicatie kijkt eerst in de working dir of daar een ini staat:
-zo ja: dan die gebruiken
-zo nee: dan die in de jar zelf gebruiken.

[ Voor 5% gewijzigd door Alarmnummer op 19-10-2004 11:37 ]


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Dat is volgens mij wat ik bedoel. De .ini zit dus niet in de .jar maar in de map waarin de .jar staat. Momenteel moet de .jar in de een map staan die ik heb gehardcode. Maar ik zal eens op zoek gaan naar de working dir en hoe ik die achterhaal.

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2

Pagina: 1