Avatar billede dennism Nybegynder
24. september 2006 - 13:48 Der er 31 kommentarer og
1 løsning

Java: Indstillinger fra .ini-fil?

Jeg har et program, som f.eks. skal bruge nogle data til at connecte til en mySQL server.
Det kunne være smart, hvis jeg kunne lave sådan, at programmet hentede disse data (dvs. hostname, user, pass og database) fra en .ini-fil eller noget lignende.

Nogen der kan give et eksempel på, hvordan dette kan løses?
Avatar billede _carsten Nybegynder
24. september 2006 - 13:58 #1
Brug Properties, det er en nem måde at gøre det på

Lav følgende ini fil "test.ini" med indhold

hostname=www.dyt.dk
user=Kaj
pass=Børge

Gem som C:\test\test.ini


import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;


public class Test {

    public Test() {
        Properties prop = new Properties();

        try {
            String path = "C:\\test\\test.ini";

            prop.load(new FileInputStream(path));
            String hostname = prop.getProperty("hostname");
            String user = prop.getProperty("user");
            String pass = prop.getProperty("pass");

            System.out.println(hostname + "\n" + user + "\n" + pass);
           
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    }

    public static void main(String[] args) {
        new Test();
    }
   
}
Avatar billede _carsten Nybegynder
24. september 2006 - 14:00 #2
Det der er knap smart, er at gemme user og password i en fil som kan læses af alle
Avatar billede dennism Nybegynder
24. september 2006 - 14:03 #3
Hvilket alternativ har jeg? :)
Avatar billede dennism Nybegynder
24. september 2006 - 14:09 #4
Jeg er interesseret i, at test.ini skal ligge samme sted som applikationen. Hvordan angiver jeg det i path? Dur:
String path = "\test.ini";
Avatar billede _carsten Nybegynder
24. september 2006 - 14:10 #5
Jeg ville gemme databasenavn, username og password på server hvor username og password så verificeres når bruger logger ind, eventuelt i en tabel i db
Avatar billede _carsten Nybegynder
24. september 2006 - 14:12 #6
Nej, men System.getProperty("user.dir") + (\\test\\test2) hvor dybt i app du gemmer test.ini
Avatar billede _carsten Nybegynder
24. september 2006 - 14:16 #7
Eller denne getClass().getResource(".");

Som giver stien til den aktuelle class fil

Prøv selv
System.out.println(hostname + "\n" + user + "\n" + pass + "\n" + getClass().getResource("."));
Avatar billede dennism Nybegynder
24. september 2006 - 14:30 #8
Jeg fik det til at du bare med:
            String path = "settings.ini";

Ideen er, at brugeren selv skal kunne ændre mySQL-data, derfor er han jo nødt til at have mulighed for at gemme den et sted?
Avatar billede _carsten Nybegynder
24. september 2006 - 14:37 #9
Okay, men alle brugere af den pc, kan jo se de andre brugeres password!

Jeg kan ikke lige se det skulle være nødvendigt at gemme data på pc'en !?
Avatar billede dennism Nybegynder
24. september 2006 - 18:43 #10
Men..tak for hjælpen!

Smider du lige et svar?
Avatar billede _carsten Nybegynder
24. september 2006 - 19:08 #11
OK - men fik vi løst problemet ?
Avatar billede dennism Nybegynder
24. september 2006 - 19:19 #12
Næsten.

Jeg har denne i toppen af min static method:
        System.out.println(getClass().getResource("."));

Men jeg får denne fejl:
        non-static method getClass() cannot be referenced from a static context

Kan du fortælle mig, hvorfor jeg får denne fejl?
Avatar billede thomaswinterberg Nybegynder
24. september 2006 - 22:11 #13
Det er fordi du prøver at referer til ikke ikke statisk context i en statisk metode.
Flyt din System.out.println(getClass().getResource(".")); hen i public test() metoden
og så får du ingen fejl
Avatar billede dennism Nybegynder
25. september 2006 - 08:14 #14
Så bør jeg jo få samme problem igen, da test heller ikke er statisk!

Jeg har forsøgt mig med:
            String path = System.getProperty("user.dir") + "/settings.ini";

Men den returnerer f.eks. /home/dennis/settings.ini når jeg forsøger at køre programmet. Det er naturligvis fordi den bliver kørt mens cd er i /home/dennis. Men jeg interesseret i, at få stien til settings-filen. Kan det ikke klares?
Avatar billede dennism Nybegynder
25. september 2006 - 19:48 #15
Kan du evt. hjælpe her:
http://www.eksperten.dk/spm/734558
Avatar billede _carsten Nybegynder
25. september 2006 - 19:58 #16
Sorry - var lige væk et stykke tid.

Kører du dit program fra en IDE eller dosprompt ?
Avatar billede dennism Nybegynder
25. september 2006 - 20:08 #17
Jeg har forsøgt begge dele.. :)
Avatar billede _carsten Nybegynder
25. september 2006 - 20:20 #18
Tager du højde for om din fil ligger i en package ?

Prøv nedenstående, den virker


public class Tester {
    public Tester() {
        System.out.println(System.getProperty("user.dir"));
       
        System.out.println(getClass().getResource("."));
    }

    public static void main(String[] args) {
        new Tester();
    }
   
}
Avatar billede stigc Nybegynder
25. september 2006 - 21:00 #19
Jeg bruger følgende...

        try
        {     
            java.security.CodeSource source = Common.class.getProtectionDomain().getCodeSource();
            java.net.URI sourceURI = new java.net.URI(source.getLocation().toString());
            java.io.File folder = new java.io.File(sourceURI);
            applicationPath = folder.getParentFile().getAbsolutePath() + fileSeparator;
        }
        catch (Exception ex)
        {
            applicationPath = System.getProperty("user.dir") + fileSeparator;
        }
Avatar billede stigc Nybegynder
25. september 2006 - 21:01 #20
og så lige forinden...

String applicationPath  = null;
String fileSeparator = System.getProperty("file.separator");
Avatar billede dennism Nybegynder
26. september 2006 - 18:32 #21
Stigc >>

jeg får denne fejl:
/home/dennis/Java/TimetableConvert/src/TimetableConvert.java:17: cannot find symbol
symbol  : class Common
location: class TimetableConvert
            java.security.CodeSource source = Common.class.getProtectionDomain().getCodeSource()
Avatar billede stigc Nybegynder
26. september 2006 - 20:26 #22
:) Det er klippet ud at min kode. Common er klassen hvori den kode indgår i. Skriv i stedet for dit klassenavn, så skulle det virke.
Avatar billede dennism Nybegynder
27. september 2006 - 09:23 #23
Perfekt ;)
Må jeg bede om et svar fra dig, stigc? Så får du også lige lidt point her..
Avatar billede stigc Nybegynder
27. september 2006 - 17:49 #24
Jeg samler ikke rigtig på den. Fint at du kan bruge det.
Avatar billede dennism Nybegynder
27. september 2006 - 18:27 #25
Tak for hjælpen!
Avatar billede dennism Nybegynder
11. oktober 2006 - 20:06 #26
Håber du kan give mig lidt mere hjælp.
Hvordan foreslår du, at jeg skriver til denne settings-fil, når jeg skal have rettet de data der står deri? Er der en metode til det, eller skal jeg selv lave noget som skriver de ønskede linier til filen?
Avatar billede dennism Nybegynder
16. oktober 2006 - 12:53 #27
Stigc >>

Har du en løsning på problemet?
Avatar billede stigc Nybegynder
16. oktober 2006 - 17:38 #28
Næsten det som du gjorde da du hentede

File file = new File("...");
FileOutputStream out = new FileOutputStream(file);
prop.store(out, "Headline");
Avatar billede dennism Nybegynder
02. november 2006 - 20:23 #29
Jeg kan desværre ikke få det til at virke :(

Jeg har denne kode:
            Properties prop = new Properties();
            FileOutputStream fileOut = new FileOutputStream(HorseBetting.Application.path + "settings2.ini");
            PrintWriter fileOutWrite = new PrintWriter(fileOut);
            fileOutWrite.print("server="+getServer());
            fileOutWrite.print("username="+getUsername());
            fileOutWrite.print("password="+getPassword());
            fileOutWrite.print("database="+getDatabase());
            prop.store(fileOut, "mySQL konfigurationsfile");

Men får bare en fil der indeholder:
#mySQL konfigurationsfile
#Thu Nov 02 20:28:32 CET 2006

Håber du kan fortælle mig, hvad der er galt?
Avatar billede dennism Nybegynder
05. november 2006 - 14:28 #30
kan du hjælpe her?
Avatar billede stigc Nybegynder
05. november 2006 - 18:09 #31
Du skal ikke selv skrive properties til filen. Det gør den for dig.

prop.setProperty("Field1", "Value1");
prop.setProperty("Field2", "Value2");
prop.setProperty("Field3", "Value3");

//Gem
File file = new File("...");
FileOutputStream out = new FileOutputStream(file);
prop.store(out, "Headline");
Avatar billede dennism Nybegynder
06. november 2006 - 08:09 #32
Tak, det var bedre :)
Hvad er det iøvrigt for en underlig rækkefølge prop laver? De komme slet ikke ud i den rækkefølge jeg skrev dem.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester