# config Datei erstellen + einlesen



## hüteüberhüte (29. Jun 2012)

Hi, wie kann ich eine Text-Datei, in der integerWerte stehen sollen, erstellen, wenn sie nicht bereits vorhanden ist, und die Werte einlesen?

Inhalt:

```
wert1 = 123
wert2 = 456
wert3 = 789
usw.
```


----------



## buzz!dev (29. Jun 2012)

Google mal nach Scanner bzw. Writer. Auch in der Insel gibt es ein eigenes Kapitel zu diesem Thema.


----------



## hüteüberhüte (29. Jun 2012)

Hab s jetzt so gemacht:


```
package rou;

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

public class Main {

    private static long millsec;
    ...

    public static void main(String[] args) throws IOException {
        Properties p = new Properties();
        p.load(new FileInputStream("config.txt"));
        millsec = Long.parseLong(p.getProperty("millsec", "1000"));
        ...
        p.store(new FileOutputStream("config.txt"), "config.txt");

        ...
    }
}
```

Ist das die standard vorgehensweise?


----------



## Fab1 (29. Jun 2012)

Ob das die Standardvorgehensweise ist oder nicht, kann ich nicht beurteilen, aber ich denke folgende Lösung wäre auch ganz nett.

Ich hoffe ich habe dein Problem richtig verstanden. 


```
import java.io.*;


public class Test2 {

	public boolean isFileAvailable() {

		System.out.println("\nisFileAvailable Methode wird aufgerufen: ");
		
		File f = new File("config.txt");
		if (f.exists()) {
			return true;
			
		}else{
			return false;
		}

	}
	
	public void writeFile(){
		
		System.out.println("\nwriteFile Methode wird aufgerufen: ");
		
		try {
				BufferedWriter writer = new BufferedWriter(new FileWriter("config.txt"));
				writer.write("123 \n");
				writer.write("456 \n");
				writer.write("789 \n");
				
				
				writer.close();
				
			} catch (IOException e) {

				e.printStackTrace();
			}
	}
	
	public void loadFile(){
		
		System.out.println("\nloadFile Methode wird aufgerufen: ");
		
		try{
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("config.txt")));
			String zeile = "";
			
			
			while( (zeile = reader.readLine()) != null){
				System.out.println(zeile);
			}
			
		}catch(IOException ex){
			ex.printStackTrace();
		}
	}
}
```


Die Aufrufende Klasse:


```
public class Test{
	
	
	public static void main(String[]args){
		
		Test2 t = new Test2();
		
		System.out.println(t.isFileAvailable());
		t.writeFile();
		t.loadFile();
	}
}
```


----------



## Properties (29. Jun 2012)

Im Gegensatz zu dem was "buzz!dev" meinte : JA , Properties sind die Standard-Vorgehensweise wenn es um die Speicherung von Key-Value Paaren in eine "Text"-Datei geht.

Properties ist nun mal auch das Java-eigene Format, z.B. System.getProperties() liefert dir ein Properties-Objekt in dem halt verschiedene Parameter der aktuellen VM-Instanz mit ihren "Schlüsseln" enthalten sind.
In wie weit sich Properties selbst um das anlegen nicht vorhandener Dateien kümmert kann ich nicht sagen, würde aber wetten das intern eine Prüfung gemacht und eine Exception geworfen wird.


----------



## hüteüberhüte (29. Jun 2012)

Dabei tritt ein Problem auf, config.txt enthält keine Werte:


```
public static void main(String[] args) throws IOException {
        Properties p = new Properties();
        File f = new File("config.txt");
        f.createNewFile();
        p.load(new FileInputStream(f));
        millsec = Long.parseLong(p.getProperty("millsec", "10000"));
        ...
        p.store(new FileOutputStream(f), "config.txt");
        ...
    }
```



> * Properties from the defaults table of this <code>Properties</code>
> * table (if any) are <i>not</i> written out by this method.



Wie lasse ich denn Werte der "default table" schreiben?


----------



## hüteüberhüte (29. Jun 2012)

Properties hat gesagt.:


> In wie weit sich Properties selbst um das anlegen nicht vorhandener Dateien kümmert kann ich nicht sagen, würde aber wetten das intern eine Prüfung gemacht und eine Exception geworfen wird.



Wäre dir dankbar, wenn du nochmal einen Blick auf den obigen Post ( http://www.java-forum.org/java-basi...nfig-datei-erstellen-einlesen.html#post915022 ) werfen würdest. Die Datei lege ich, falls sie nicht bereits vorhanden ist, mit 
	
	
	
	





```
f.createNewFile();
```
 an. Allerdings steht nach dem Aufruf von 
	
	
	
	





```
store
```
 nichts in dieser Datei...


----------



## Properties (29. Jun 2012)

Du musst die Klasse Properties auch richtig verwenden.

Zu erst erstellst du dir ein Properties-Objekt : Properties props=new Properties();
Dann musst du auch entsprechend die Werte in das Properties-Objekt eintragen : props.setProperty("Key", "Value");
Zum Speichern dann einfach store() callen : props.store(new FileOutputStream("config.txt"), null);

Wobei es eigentlich egal ist ob "comment" null oder ein gültiger String ist, für das Laden hat es keine Bedeutung.

Um Properties einzulesen einfach wieder ein Properties-Objekt erstellen und darauf load() callen : props.load(new FileInputStream("config.txt"));
Und dann wieder mit dem Key auf die Value zugreifen : props.getProperty("Key");

Das was du da machst ist halt nur die halbe Arbeit.


----------



## hüteüberhüte (29. Jun 2012)

Ok, aber das komplizierte daran ist, dass ich nur dann "Standard"-Werte eintragen lassen will, wenn sie in der Datei noch nicht vorhanden sind...


----------



## hüteüberhüte (29. Jun 2012)

...gut, eine Möglichkeit wäre:


```
Properties p = new Properties();
        File f = new File("config.txt");
        f.createNewFile();
        p.load(new FileInputStream(f));
        p.setProperty("millsec", p.getProperty("millsec", "10000"));
        ...
        millsec = Long.parseLong(p.getProperty("millsec"));
        ...
        p.store(new FileOutputStream(f), "config.txt");
        ...
```

Aber das wäre doch irgendwie über das Notwendige hinausgehend, jetzt steht im Source für jede statische Variable dreimal z.B. 
	
	
	
	





```
"millsec"
```
...


----------



## Jodo (30. Jun 2012)

Du willst schauen ob es zu einem Key schon einen Wert gibt. Wenn ja, dann soll er den holen. Wenn nicht, dann soll der Standard-Wert eingetragen werden. richtig?


```
Properties p = new Properties();
File f = new File("config.txt");
f.createNewFile();
p.load(new FileInputStream(f));

String value;

if((value = p.getProperty("millsec", "100000") != null) {
     //irgendwas mit dem Wert machen
} else {
     p.setProperty("millsec", DEFAULT_VALUE);
     p.store(new FileOutputStream(f), "config.txt");
};
```


----------



## hüteüberhüte (30. Jun 2012)

Ja, aber innerhalb einer Zeile wäre gut


----------



## njans (30. Jun 2012)

```
p.getProperty(varA, "10000");
```

"10000" ist doch der Default-Value der geladen wird, wenn eben das Propertie nicht gefunden wird. Wenn man bei dem Aufruf den Default-Value weg lässt, kann die Methode auch null returnen. 
ich scheitere anscheinend daran, dass Problem zu erkennen.


----------



## hüteüberhüte (30. Jun 2012)

Das Problem besteht darin, dass die config-Datei am Anfang noch nicht vorhanden ist und dass das Programm diese in diesem Fall erstellen soll
Wenn sie aber vorhanden ist, dann sollen die entsprechenden Werte verwendet werden, die auch vom Benutzer verändert worden sein könnten


```
p.setProperty("millsec", p.getProperty("millsec", "10000"));
```
 -> setzt nur dann den Wert, wenn er noch nicht vorhanden ist. Aber das sieht irgendwie falsch aus, oder?


----------



## njans (30. Jun 2012)

Dann mach doch eine Default Properties, die eben nur die Default Werte enthält und füge alle neuen properties mittels putAll hinzu.


----------



## hüteüberhüte (30. Jun 2012)

Achso, das wäre ja ganz einfach: Einfach vor dem p.load-Aufruf alle default-Werte hinzufügen. Welche dann bereits in der config-Datei vorhanden waren, werden übernommen.  Das ist mit gestern partout nicht eingefallen


----------

