# .properties Dateien auslesen



## Serpil (3. Mai 2007)

Hallo leute,

ich habe da ein kleines Problem.
Ich erstelle selber eine .properties datei. Ich würde gerne die werte aus der properties datei auslesen und in einem string speichern um mit diesen weiterzuarbeiten. Das mit dem auslesen funktioniert aber das speichern nicht.
Wenn ich es so mache

```
Properties properties = new Properties();
for(int i = 0; i < länge; i++)
{
      test[i] = properties.toString();
}
```

dann speichert er mir die werte aus der properties datei in einer zeile. 
Kann mir da jemand weiterhelfen?

Danke und viele Grüße
Serpil


----------



## Niederbobi (3. Mai 2007)

Also ich hab das mit einer kleinen Klasse gemacht ..


```
... class Prop extends Properties
{
 ....
 private Prop ()
    {
        super();
        in = getClass().getResourceAsStream( "/" + FILENAME );
 .....
            try
            {
                this.load( in );
 ....
 ....
```

dann kannste mit den Methoden von Properties via Prop.getProperty(..) auf die Daten zugreifen.

Ich hoffe das hilft
Dirk

PS: wobei du dir die Ableitung auch schenken kannst! Ich hab da noch ein paar zusätzliche Methoden dabei .. und das ganze singleton - aber das muss nicht sein!


----------



## Serpil (3. Mai 2007)

danke für deine antwort. Leider hilft mir das nicht allzu viel.
Ich will es in einem String (Array) speichern, da ich es mit einer for schleife durchlaufen will um mit anderen werten zu vergleichen und nicht einzeln abfragen will.

Gruß
Serpil


----------



## zeja (3. Mai 2007)

Probiers mal so:

```
Properties props = new Properties();
FileInputStream fi = new FileInputStream("test.properties")
props.load(fi);
fi.close();

Set<Map.Entry<Object,Object>> set = props.entrySet();
String [] arr = new String[set.size()];
int cnt = 0;
for(Map.Entry<Object,Object> entry : set ){
String key = (String) entry.getKey();
String value = (String) entry.getValue();
arr[cnt++] = key;
}

System.out.println(Arrays.toString(arr));
```


----------



## Serpil (3. Mai 2007)

Perfekt. Es funktioniert.

Vielen dank für eure hilfe.
Gruß Serpil


----------



## Serpil (3. Mai 2007)

ich habe noch eine kurze frage.
Und zwar bei der ausgabe von dem array schmeisst er sie mir durcheinander.
Gibt es eine Möglichkeit dass sie in der richtigen reihenfolge aus der properties datei gelesen wird.

Gruß Serpil


----------



## zeja (3. Mai 2007)

Die Daten werden intern in einer HashMap abgelegt, dadurch geht die Reihenfolge verloren.

Eventuell macht commons configuration das anders. Bin mir aber nicht sicher.


----------



## Serpil (3. Mai 2007)

hab zwar noch nie davon gehört werds aber mal googeln
Danke

Gruß serpil


----------



## Serpil (3. Mai 2007)

komm damit nicht zurecht  

Hat jemand vielleicht eine andere Idee. Ich komm nicht weiter. Probier die ganze zeit schon rum funktioniert aber nicht  

Gruß Serpil


----------



## Niederbobi (3. Mai 2007)

Naja ich komm mit der Notation von zeja nicht so ganz klar, mach hier noch mit 1.4x rum ..

aber zum Sortieren würde ich aus dem Set ein TreeSet machen:


```
java.util.TreeSet sortSet= new java.util.TreeSet(set);
```

und dann mit dem sortSet weiter machen - ob das aber in J5 geht?

Probiers mal

Dirk


----------



## Serpil (3. Mai 2007)

Schaut leider nicht so aus   Schade
wäre ja auch zu schön gewesen.
aber trotzdem danke.
Das heisst dann wohl weiterprobieren...
Gruß serpil


----------



## Niederbobi (3. Mai 2007)

Okay hier mal für die jdk 4

```
java.util.TreeSet set = new java.util.TreeSet(props.keySet());
    String [] arr = new String[set.size()];
    int cnt = 0;
    java.util.Iterator it = set.iterator();
    while (it.hasNext())
    {
      String key = (String) it.next();
      String value = (String) props.getProperty(key);
      arr[cnt++] = key + ": " + value;
    }
    System.out.println(java.util.Arrays.asList(arr));
```

nächster Versuch ..

Dirk


----------



## Serpil (4. Mai 2007)

Danke für den neuen Versuch.
Aber leider sortiert die methode alles nach dem alphabet.
Ich werds jetzt natürlich weiter probieren irgendwie muss das schon gehen.

Gruß serpil


----------



## Serpil (4. Mai 2007)

ich bin am ende mit meinem Latein...

Hat keiner ne idee wie das funktioniern kann. Ich kriegs einfach nicht hin

Gruß Serpil


----------



## zerix (4. Mai 2007)

Hallo,

darf ich fragen, warum es so wichtig ist, dass es in genau der gleichen reihenfolge in dem String-Array steht?

MFG

zEriX


----------



## Serpil (4. Mai 2007)

weil ich genau die reihenfolge brauche um eine xml datei zu ersellen um die dann in die daten bank hochzuladen.
Ich glaube dass ich das irgendwie anders machen muss ich probier schon die ganze zeit aber es funktioniert nicht.


----------



## Kulabac (4. Mai 2007)

Ich hab gerade nochmal kurz in die API geschaut um sicherzugehen. Fängt mit "public class Properties extends Hashtable<Object,Object>" an. Damit gibt's leider von Anfang an keine festgelegte Reihenfolge. Jedes in die Properties geschriebene Objekt kann alle anderen komplett umsortieren! - Und beim Auslesen der Datei schreibt er da nunmal viel rein... 
Da es auf die Reihenfolge bei dir ankommt, scheint eine HashMap für dich der falsche Datentyp zu sein. Wenn ich das richtig verstehe versuchst du dir die Daten anhand ihrer Position zu besorgen (also eines Iterators) und nicht anhand der Schlüssel.


----------



## zerix (4. Mai 2007)

Du willst aus der properties-Datei eine XML-File erstellen? Das kann Java doch von Haus aus.


```
properties.storeToXML()
```

hilft dir das nicht?

MFG

zEriX


----------



## Serpil (4. Mai 2007)

Danke für deine Antwort. Ja ich hab das mit der HashMap auch schon gelesen.
Ja genau ich möchte die Strings in der properties Datei in der gleichen Reihenfolge in einem Array speichern.

Gruß Serpil


----------



## Serpil (4. Mai 2007)

hab ich auch schon probiert aber der verändert die reihenfolge auch 
gruß


----------



## zerix (4. Mai 2007)

Zur Not könntest du die properties-Datei mit einem BufferedReader und einem FileInputStream Zeile für Zeile auslesen, dann hast du es in der richtigen Reihenfolge.

MFG

zEriX


----------



## Serpil (4. Mai 2007)

es bleibt mir wahrscheinlich auch nichts anderes übrig. Naja dann muss ich es eben so machen. Hilft alles nicht.

Vielen Dank für eure Hilfe...

Gruß Serpil


----------



## inter (4. Mai 2007)

Hallo zusammen,

wieso nehmt Ihr nicht einen Container, der die gewünschte Eigenschaft (gleiche Reihenfolge) zur Verfügung stellt? Es gibt eigentlich für jeden denkbaren Anwendungsfall etwas passendes. SET und TREESET sind das hier nicht, die sind für unsortierte bzw. sortierte Mengen ohne gleiche Elemente gedacht.

Als Container für gleichbleibende Reihenfolge würde ich LinkedList empfehlen. Da kann man die Elemente genau in der Reihenfolge wieder rausholen, in der man sie reingeworfen hat.


----------



## Serpil (4. Mai 2007)

das habe ich auch schon probiert. Hab aber probleme damit die properties in der liste zu speichern. 

Gruß Serpil


----------



## inter (4. Mai 2007)

Also nach reiflicher Überlegung meine ich auch, Du müsstest Dich von der Properties-Klasse trennen. Die ist für Deine Anforderungen ungeeignet, wie Kulabac erklärt hat.

Ich würde jetzt auf Basis einer LinkedList (oder zwei, eine für Property.name und eine für den entsprechenden Property.value) eine neue Klasse definieren, die dann nach zerix ´s Idee de-/ serialisierbar ist.


----------



## flashray (7. Mai 2007)

Hallo Serpil,

schau mal hier:

```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.Scanner;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class SimplePhoneBook extends JPanel implements ActionListener,
		ListSelectionListener {

	private JButton loadButton, saveButton, insertButton, clearButton;

	private JTextField forenameField, surnameField, telnumberField;

	private DefaultListModel model;

	public SimplePhoneBook(JFrame frame) {
		frame.setTitle("Phone Book");
		this.setLayout(new BorderLayout());

		this.add(this.createFormPanel(), "North");
		this.add(this.createListPanel(), "Center");
		this.add(this.createButtonPanel(), "South");
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setAlwaysOnTop(true);
		frame.setLocationByPlatform(true);

		frame.add(new SimplePhoneBook(frame));

		frame.pack();
		frame.setVisible(true);
	}

	public JComponent createFormPanel() {
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(0, 2));
		panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

		panel.add(new JLabel("Forename"));
		panel.add(forenameField = new JTextField(10));
		panel.add(new JLabel("Surname"));
		panel.add(surnameField = new JTextField(10));
		panel.add(new JLabel("Phone Number"));
		panel.add(telnumberField = new JTextField(10));

		return panel;
	}

	public JComponent createListPanel() {
		JPanel panel = new JPanel();
		panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

		JList list = new JList(model = new DefaultListModel());
		list.addListSelectionListener(this);

		JScrollPane scrollPane = new JScrollPane(list);

		panel.add(scrollPane);

		return panel;

	}

	public JComponent createButtonPanel() {
		JPanel panel = new JPanel();
		panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

		loadButton = new JButton("Load");
		saveButton = new JButton("Save");
		insertButton = new JButton("Insert");
		clearButton = new JButton("Clear");

		loadButton.setActionCommand("laod");
		saveButton.setActionCommand("save");
		insertButton.setActionCommand("insert");
		clearButton.setActionCommand("clear");

		loadButton.addActionListener(this);
		saveButton.addActionListener(this);
		insertButton.addActionListener(this);
		clearButton.addActionListener(this);
		

		panel.add(loadButton);
		panel.add(insertButton);
		panel.add(clearButton);
		panel.add(saveButton);

		return panel;
	}

	public void insert() {
		model.addElement(forenameField.getText() + " * "
				+ surnameField.getText() + " * " + telnumberField.getText());
		forenameField.setText("");
		surnameField.setText("");
		telnumberField.setText("");
	}
	
	public void clear() {
		model.clear();
	}

	public void load() {
		Scanner scanner = null;
		try {
			scanner = new Scanner(new File("telefonbuch.dat"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

		model.clear();

		while (scanner.hasNextLine())
			model.addElement(scanner.nextLine());
	}

	public void save() {
		StringBuffer sb = new StringBuffer();

		for (int i = 0; i < model.size(); i++) {
			sb.append(model.get(i) + "\n");
		}

		try {
			FileWriter fw = new FileWriter(new File("telefonbuch.dat"));
			fw.write(sb.toString());
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();
		if (s.equalsIgnoreCase("laod")) {
			this.load();
		} else if (s.equalsIgnoreCase("save")) {
			this.save();
		} else if (s.equalsIgnoreCase("insert")) {
			this.insert();
		}  else if (s.equalsIgnoreCase("clear")) {
			this.clear();
		}else
			System.err.println("Else");
	}

	public void valueChanged(ListSelectionEvent e) {
		JList list = (JList) e.getSource();
		String selection = model.get(list.getSelectedIndex()).toString();
		String data[] = selection.split("\\*");
		forenameField.setText("" + data[0].trim());
		surnameField.setText("" + data[1].trim());
		telnumberField.setText("" + data[2].trim());
	}
}
```


Vg Erdal


----------



## Serpil (7. Mai 2007)

Danke für eure antworten. Werd mir das alles mal in ruhe anschauen.

Gruß Serpil


----------



## danielandross (18. Mai 2007)

Hallo,
ich habe da ein ähnliches Problem: Ich möchte einen Wert in meiner Properties datei aktualisieren. Aber mit der Methode save wirft er mir die Ordnung übern Haufen und die Kommenatre werden auch weggeworfen. Habe deshalb euren ansatz versucht:


```
InputStream resourceAsStream = getClass().getClassLoader()
					.getResourceAsStream("RunApp.properties");
			InputStreamReader reader = new InputStreamReader(resourceAsStream);
			BufferedReader bufferedReader = new BufferedReader(reader);
			/**
			 * Initialising the output
			 */
			String newline = System.getProperty("line.separator");
			try {
				FileWriter fileWriter = new FileWriter(
						"src//main//java//RunApp.properties");
				try {
					boolean done = false;
					while (!done) {
						String sTemp = bufferedReader.readLine();
						if (sTemp == null)
							done = true;
						else {
							if (sTemp.contains("PageFormat="))// updating
								sTemp = "PageFormat=" + newFormat;
							fileWriter.write(sTemp);
							fileWriter.write("\n");// darum gehts
							fileWriter.close();
							System.out.println(sTemp);
						}
					}
```

Das Problem ist jetzt dass nun zwar die Reihenfolge eingehalten wird, aber dann alles in eine Zeile geschrieben wird. Ganz egal ob ich die neue Zeile mit +"\n" oder mit meiner newline Variable realisiere. Wisst ihr was das soll?

edit: Es hat doch mit dem newline separator funktioniert war freitag wohl nicht mehr ganz fit


----------



## takidoso (18. Mai 2007)

Serpil hat gesagt.:


> ich bin am ende mit meinem Latein...
> 
> Hat keiner ne idee wie das funktioniern kann. Ich kriegs einfach nicht hin
> 
> Gruß Serpil



also Wenn du sie erfolgreich in einem Array hast, musst Du dieses nur noch sortieren.
Dazu gibt es in der Klasse *java.util.Arrays* einige *sort* Routinen.
da sollte sicher eine Passen 

viel Glück

Takidoso


----------



## takidoso (18. Mai 2007)

Ok das Thema mit dem Sortieren in Properties habe ich auch schon des öfteren gehabt, bis es mir zun bund wurde und ich einfach die Properties-Klasse erweitert habe...
jedoch hat leider die Properties-Klasse den Haken das bestimmte Routinen nicht protected sind :-(. Daher muss man sich demnach das ein oder andere kopieren (ich weiß es ist nicht schön aber wenn man wenigstens etwas wiederverwenden will von dem Ding geht's wohl leider nicht anders
 


```
package de.cmk.util;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;


public class CMKProperties extends java.util.Properties
{

	public CMKProperties()
	{
		super();
	}
	public CMKProperties(java.util.Properties defaults)
	{
		super(defaults);
	}
	
	/**
	 * Arbeitet prinzipeille genauso wie die Elternklasse jedoch werden die Properites
	 * sortiert gemäß gegebenen Comparators ausgegeben.
	 * @param out
	 * @param header
	 * @param keyComp
	 * @throws IOException
	 */
	public void store(OutputStream out, String header, Comparator keyComp)  throws IOException
    {
        BufferedWriter awriter;
        awriter = new BufferedWriter(new OutputStreamWriter(out, "8859_1"));
        if (header != null)
        {
            writeln(awriter, "#" + header);
        }
        
        writeln(awriter, "#" + new Date().toString());
        synchronized (this)  
        {        	
        	SortedSet keys = new TreeSet(keyComp); 
        	keys.addAll(keySet());
        	
        	Iterator kIter = keys.iterator();
            while(kIter.hasNext()) 
            {
                String key = (String)kIter.next();
                String val = (String)get(key);
                key = saveConvert(key, true);

	        /* No need to escape embedded and trailing spaces for value, hence
	         * pass false to flag.
	         */
                val = saveConvert(val, false);
                writeln(awriter, key + "=" + val);
            }
        }
        awriter.flush();
    }

	
	
	//----------------------------------------------------------------------------------------------------
	// Leider sind die entscheidenden Routinen private. Hätten besser protected sein sollen, 
	// dann hätte ich sie nicht kopieren müssen :-(((((((

	/**
	 * 
	 * @param bw
	 * @param s
	 * @throws IOException
	 */	
	private static void writeln(BufferedWriter bw, String s) throws IOException 
	{
        bw.write(s);
        bw.newLine();
    }
	/**
	 * @param theString
	 * @param escapeSpace
	 * @return
	 */
	private String saveConvert(String theString, boolean escapeSpace) {
        int len = theString.length();
        StringBuffer outBuffer = new StringBuffer(len*2);

        for(int x=0; x<len; x++) 
        {
            char aChar = theString.charAt(x);
            switch(aChar) 
            {
            	case ' ':
            		if (x == 0 || escapeSpace)
            		{
            			outBuffer.append('\\');
            		}

            		outBuffer.append(' ');
            		break;
                case '\\':
                	outBuffer.append('\\'); outBuffer.append('\\');
                	break;
                case '\t':
                	outBuffer.append('\\'); outBuffer.append('t');
                	break;
                case '\n':
                	outBuffer.append('\\'); outBuffer.append('n');
                	break;
                case '\r':
                	outBuffer.append('\\'); outBuffer.append('r');
                	break;
                case '\f':
                	outBuffer.append('\\'); outBuffer.append('f');
                	break;
                default:
                    if ((aChar < 0x0020) || (aChar > 0x007e)) 
                    {
                        outBuffer.append('\\');
                        outBuffer.append('u');
                        outBuffer.append(toHex((aChar >> 12) & 0xF));
                        outBuffer.append(toHex((aChar >>  8) & 0xF));
                        outBuffer.append(toHex((aChar >>  4) & 0xF));
                        outBuffer.append(toHex( aChar        & 0xF));
                    } 
                    else 
                    {
                        if (specialSaveChars.indexOf(aChar) != -1)
                            outBuffer.append('\\');
                        outBuffer.append(aChar);
                    }
            }
        }
        
        return outBuffer.toString();
    }
	
	private static char toHex(int nibble) 
	{
		return hexDigit[(nibble & 0xF)];
	}

	/** A table of hex digits */
	private static final char[] hexDigit = 
	{
		'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
	};
	    
	private static final String specialSaveChars = "=: \t\r\n\f#!";
}
```


----------

