Üdv mindenkinek!
Ebben a kis topikban szeretném bemutatni azt, hogy hogyan is olvashatunk be / módosíthatunk konfigurációs fájlt a programunkkal Java-ban. (*.ini, *.conf)
Először is kreáljunk egy <file_name>.ini fájlt. (Bármilyen nevet adhattok neki, amilyet csak szeretnétek, azonban jelen esetben így fogom jelölni a neveket, mint változókat)
Írjuk bele mondjuk ezt:
; This is a comment row.
; Hello, this is my configuration file.
; An other comment row.
[variables]
MyVariable=Apple
Miután ez megvan, kezdhetjük is a programunk megírását.
Itt egy teljes kód a konfigurációs fájl olvasójáról, később kifejtem majd a részeit:
LINK_TO_REPOSITORY (https://bitbucket.org/doro_szilard/colibricore/src/185c203c7870/src/test/hu/colibricore/ColibriTests/ConfigurationTester.java?at=default)
Ez a fájl egy teszt side-project része, tehát, ha feljebb léptettek, akkor megtaláljátok a main függvényt, amely működőképessé teszi a gépezetet. (config fájl megtalálható a %ROOT%/data/conf/configuration_test.ini helyen)
A kód kifejtése:
Először is importálnunk kell a megfelelő csomagokat, amelyek szükségesek lesznek a programunk megírásában.
Úgy tehetjük meg, hogy ezt írjuk be a forráskódba:
import java.io.*; // Ez importájla az io csomagban található osztályokat, azonban a nested classokat nem! (beágyazott osztályokat)
import java.util.Properties; // Ez kizárólag az util csomagban található Properties osztályt importálja.
Mivel osztályunkat public-ként definiáltuk (public class ConfigurationTester{...}), ezért a fájlunk nevének is ennek kell lennie, különben nem tudjuk leforgatni a forrásfájlt.
Második lépés: Bevezetünk egy protected változót, ami annyit takar, hogy kizárólag a "test.hu.colibricore.ColibriTests" csomagban lévő osztályok érhetik el, más osztályok nem. (Ebben különbözik a publictól)
Ez a változó fogja majd "hordozni" a konfigurációs fájlból kinyert adatot. (Miután a ConfigurationTester fájl konstruktora meghívódott, azután ez a fájl adatot fog tartalmazni a programunk következő indulásáig, vagy amig nem "reseteljük".
Harmadik lépés: Bevezetjük az osztályunk konstruktorát. (Minden esetben be van vezetve egy konstruktor, de alapértelmezetten üres! - public MyClass(){})
Például ha meg akarunk hívni egy osztályt, és azon belül is egy metódust (pl. aminek a visszatérési értéke String), akkor azt így kell megtennünk:
String test = new MyClass().stringMethod(); // A stringMethod() visszatérési értéke String
VAGY
MyClass cl = new MyClass();
String test = cl.stringMethod(); // A stringMethod() visszatérési értéke String
Negyedik, egyben utolsó lépés: Bevezetjük a Properties osztályunk változóját.
Properties p = new Properties();
Mindenek előtt ellenőriznünk kell, hogy a fájl, amit olvasni szeretnénk létezik-e. Ezt egy egyszerű if-fel megtehetjük.
if(f.exists()){...}
Ha nagyon szeretnénk valamit kiírni, ha esetleg nem létezik a fájl, akkor azt egy else záradékkal megtehetjük.
Ha létezik a fájl, akkor lejjebb lépünk egy szintet, mégpedig egy try-catch blokkba. Ez azért fontos, mert a p.load függvényünk később Exception-t okozhat, amit kezelnünk kell.
Tehát a folytatás:
try{
p.load(new FileInputStream(f));
MyVariable = p.getProperty("MyVariable");
System.out.println(MyVariable);
} catch(Exception ex){
ex.printStackTrace();
}
A Properties osztály load metódusa megnyit egy InputStream-et, amelyen keresztül olvashatóvá válik a fájlunk.
Mindezek után már a getProperty metódus visszatér a megfelelő String értékkel, ha paraméternek jó adatot adtunk meg.
Ilyen egyszerű is lenne egy konfigurációs fájl olvasása.
Módosításáról később, egy egyszerű függvény bemutatásával fogok példát adni.
Köszönöm szépen a figyelmet és érdeklődést.
Szilárd
Üdvözlök mindenkit ismét!
Egy kis kommentár, amit az előző posztomban elfelejtettem említeni: Ezek a leírások nem a teljesen kezdő programozóknak szólnak.
Térjünk is a lényegre akkor, ha ezt letudtuk.
A konfigurációs fájl módosítása rendkívül egyszerű, hiszen egy sima FileWriterrel megoldható az egész.
Ez a függvény nem kizárólag konfigurációs fájlokra húzható fel, hanem bármilyenre, amiben egy meglévő szövegrészt módosítani szeretnénk.
Maga a függvény így néz ki:
public void updateConfiguration(File file,String field,Object old_val,Object new_val) throws Exception{
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = "", oldProperty = "";
while((line = reader.readLine()) != null){
oldProperty += line + "\r\n";
}
String rewritedProperty = oldProperty.replaceAll(field+"="+old_val,field+"="+new_val);
FileWriter writer = new FileWriter(file);
writer.write(rewritedProperty);
writer.close();
}
A metódus eldob minden féle exceptiont, szóval ezt később a meghívásakor kezelnünk kell. (try-catch)
Magát a fő funkciót a FileWriter végzi el, ami az oldProperty azon sorát cseréli le, amelyben szerepel a field=old_val.
Ha például paramétereink így néznek ki:
updateConfiguration(new File("conf.ini"),"MyVariable","Apple","Pear");
Akkor a függvény lecseréli a
MyVariable=Apple
sort
MyVariable=Pear
erre.
Az oldProperty stringben tehát replacelve lesz a field=old_val -> field=new_val-ra.
Később pedig a rewritedProperty Stringet hozzáadjuk a fájlunkhoz. Felülírja azt a sort, amit módosítottunk.
Remélem érthető kis leírásra sikeredett.
Köszönöm a figyelmet és érdeklődést!
Szilárd