# werte aus einer ini-datei auslesen.



## analogo (24. Apr 2005)

hallo,

ich möchte werte aus einer ini-datei herauslesen, welche dann variablen im programm zugewiesen werden sollen. die datei hat folgende syntax:

datei.ini:

#kommentar
wert1=20
wert2=30
wert3=40

die werte sind immer ganzzahlen im bereich von 0-127, welche jeweils einem byte entsprechen. kann man auch 2 werte herauslesen?

z.b.

#kommentar
wert1=20,30
wert2=40,50

ein kurzes listing dazu wäre super..  vielen dank!


----------



## Roar (24. Apr 2005)

```
Properties props = new Properties();
props.load(new FileInputStream("daten.properties");
String wert1 = props.getProeprty("wert1");
// wert1 ist jetz 20
int wert1_als_int = Integer.parseInt(wert1); // mit try atch und so

// mehrere werte:

String[] wert1numbers = wert1.split(",");
for(String wert: wert1numbers) {
// wert parsen
}
```


----------



## Beni (24. Apr 2005)

So eine Klasse hab ich noch, die das kann:

Die Dateien können ganz normale Java-Kommentare, also // und /* */ haben. Und ein Propertie... guck in der API nach: du gibts ein Schlüssel ein, und bekommst den Wert zu dem Schlüssel wieder raus.


```
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

/**
 * Liest eine INI-Datei aus. Eine INI-Datei besteht aus einer Folge von
 * <code>key = value</code> Paaren. Dazwischen können einzeilige Kommentare
 * mit "//" oder mehrzeilige Kommentare mit "/*" und "*\/" stehen
 * 
 * @author Benjamin Sigg
 * @version 1.0
 */
public class IniReader {
	public static Properties readIni( File file ) throws IOException {
		BufferedInputStream in = new BufferedInputStream( new FileInputStream( file ));
		Properties p = readIni( in );
		in.close();
		return p;
	}
	
	public static Properties readIni( URL url ) throws IOException{
		BufferedInputStream in = new BufferedInputStream( url.openStream() );
		Properties p = readIni( in );
		in.close();
		return p;		
	}
	
	/**
	 * Liest eine INI-Datei aus, aber schliesst den Stream nicht. Es wird
	 * solange gelesen, bis der Stream -1 zurückgibt.
	 * @param in Der Stream mit den Informationen
	 * @return Die gelesenen Informationen
	 * @throws IOException Bei Problemen
	 */
	public static Properties readIni( InputStream in ) throws IOException{
		Properties prop = new Properties();
		
		
		StringBuffer buffer = new StringBuffer();
		
		boolean normalComment = false;
		boolean multiLineComment = false;
		
		int read = in.read();
		char last = (char)read;
		
		while( read != -1 ){
			read = in.read();
			char newChar = (char)read;
			
			if( normalComment ){
				if( newChar == '\n' || newChar == '\r' ){
					normalComment = false;
					read = jump( in, 1 );
					newChar = (char)read;
				}
			}
			else if( multiLineComment ){
				if( last == '*' && newChar == '/'){
					multiLineComment = false;
					read = jump( in, 1 );
					newChar = (char)read;
				}
			}
			else{
				if( last == '/' && newChar == '*' ){
					multiLineComment = true;
					read = jump( in, 1 );
					newChar = (char)read;
				}
				else if( last == '/' && newChar == '/' ){
					normalComment = true;
					read = jump( in, 1 );
					newChar = (char)read;
				}
				else{
					if( read == -1 || newChar == '\n' || newChar == '\r' ){
						if( buffer.length() > 0 ){
							buffer.append( last );
							finish( prop, buffer );
							buffer = new StringBuffer();
							
							read = jump( in, 1 );
							newChar = (char)read;
						}
					}
					else if( !(last == '\n') && !(last == '\r') )
						buffer.append( last );
				}
			}
			
			last = newChar;
		}
		
		return prop;
	}
	
	private static int jump( InputStream in, int n ) throws IOException{
		int read = -1;
		
		for( int i = 0; i < n; i++ )
			read = in.read();
		
		return read;
	}
	
	private static void finish( Properties prop, StringBuffer buffer ) throws IOException {
		int index = buffer.indexOf( "=" );
		if( index == -1 )
			throw new IOException("Non valid line: " + buffer );
		
		String key = mini( buffer.substring( 0, index ) );
		String value = mini( buffer.substring( index+1 ) );
		
		if( key.length() == 0 )
			throw new IOException("Non valid key: empty" );
		
		prop.put( key, value );
	}
	
	private static String mini( String original ){
		while( original.endsWith( " " ) || original.endsWith( "\t" ))
			original = original.substring( 0, original.length()-1 );
		
		while( original.startsWith( " " ) || original.startsWith( "\t"))
			original = original.substring( 1 );
		
		return original;
	}
}
```


----------



## Illuvatar (24. Apr 2005)

Du weißt dass java.util.Properties auch aus ini-Dateien einlesen kann??? (siehe Roar) Oder wofür die Klasse?


----------



## analogo (24. Apr 2005)

genau danach suche ich ja..


----------



## Beni (24. Apr 2005)

Hm, können die Properties Multizeilenkommentare? Falls ja: dann ist die Klasse überflüssig. Falls nein: dann weisst du um was es geht :wink:


----------



## analogo (24. Apr 2005)

funzt das eigentlich auch ohne try und catch? wofür braucht man das denn??


----------



## Roar (24. Apr 2005)

wenn in wert1 keine zahl steht un du versuchst "abc" in einen int zu parsen wird das nicht gehen


----------



## analogo (24. Apr 2005)

hab das schon ausprobiert aber funzt net.. 

Properties prop = new Properties(); 
prop.load(new FileInputStream("setup.ini"));
System.out.println(prop.load("key1")) //Ausgabe: wert1;


----------



## analogo (24. Apr 2005)

wie bekommt ihr denn immer diese schönen listings hin?


----------



## Roar (24. Apr 2005)

hm? wenn dann printl(prop.getProperty("key1"));
und was erwartest du den nfür eine ausgabe?


----------



## analogo (24. Apr 2005)

ist ein kleines test-listing, das ich hier gefunden habe.. würde mir das dann umstricken..


----------



## Beni (24. Apr 2005)

analogo hat gesagt.:
			
		

> funzt das eigentlich auch ohne try und catch? wofür braucht man das denn??



try und catch benötigt man für das Abfangen von Ausnahmen (Exceptions = Fehler).

Lies dazu am besten mal Java ist auch eine Insel, Kapitel 7


----------



## analogo (24. Apr 2005)

bei meinem kleinen beispiel-listing schreibt er mir: cannot find symbol


----------



## Roar (24. Apr 2005)

das heißt er kann irgendwas nicht finden. schau dir die ganze feherlemldug an. er schriebt dir auf was er nicht finden kann und wo er ers nicht finden kann


----------



## analogo (24. Apr 2005)

import java.io.*;

class sunsyn2
{
  public static void main(String args[])
  {
    Properties prop = new Properties();
    prop.load(new FileInputStream("sunsyn.ini"));
    System.out.println(prop.getProperty("test"));
  }
}


Compiliere D:\_1 sunsyn programm\java\test\sunsyn2.java mit Java-Compiler
sunsyn2.java:7: cannot find symbol
symbol  : class Properties
location: class sunsyn2
    Properties prop = new Properties();
    ^
sunsyn2.java:7: cannot find symbol
symbol  : class Properties
location: class sunsyn2
    Properties prop = new Properties();
                          ^
2 errors


----------



## Beni (24. Apr 2005)

Du musst "java.util.Properties" noch importieren. Hab das gerade ausprobiert, sowas würde funktionieren (obs du mit dem Code oben oder direkt mit Properties machst, ist ja egal).


```
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.Properties;

public class IniTest {
	public static void main(String[] args) throws Exception {
		Properties p = IniReader.readIni( new File( "test.txt") );
		Enumeration keys = p.keys();
		while( keys.hasMoreElements() ){
			Object key = keys.nextElement();
			System.out.println( key + " : " + p.getProperty( key.toString() ) );
		}
	}
}

/**
* Liest eine INI-Datei aus. Eine INI-Datei besteht aus einer Folge von
* <code>key = value</code> Paaren. Dazwischen können einzeilige Kommentare
* mit "//" oder mehrzeilige Kommentare mit "/*" und "*\/" stehen
*
* @author Benjamin Sigg
* @version 1.0
*/
class IniReader {
   public static Properties readIni( File file ) throws IOException {
      BufferedInputStream in = new BufferedInputStream( new FileInputStream( file ));
      Properties p = readIni( in );
      in.close();
      return p;
   }
   
   public static Properties readIni( URL url ) throws IOException{
      BufferedInputStream in = new BufferedInputStream( url.openStream() );
      Properties p = readIni( in );
      in.close();
      return p;      
   }
   
   /**
    * Liest eine INI-Datei aus, aber schliesst den Stream nicht. Es wird
    * solange gelesen, bis der Stream -1 zurückgibt.
    * @param in Der Stream mit den Informationen
    * @return Die gelesenen Informationen
    * @throws IOException Bei Problemen
    */
   public static Properties readIni( InputStream in ) throws IOException{
      Properties prop = new Properties();
      
      
      StringBuffer buffer = new StringBuffer();
      
      boolean normalComment = false;
      boolean multiLineComment = false;
      
      int read = in.read();
      char last = (char)read;
      
      while( read != -1 ){
         read = in.read();
         char newChar = (char)read;
         
         if( normalComment ){
            if( newChar == '\n' || newChar == '\r' ){
               normalComment = false;
               read = jump( in, 1 );
               newChar = (char)read;
            }
         }
         else if( multiLineComment ){
            if( last == '*' && newChar == '/'){
               multiLineComment = false;
               read = jump( in, 1 );
               newChar = (char)read;
            }
         }
         else{
            if( last == '/' && newChar == '*' ){
               multiLineComment = true;
               read = jump( in, 1 );
               newChar = (char)read;
            }
            else if( last == '/' && newChar == '/' ){
               normalComment = true;
               read = jump( in, 1 );
               newChar = (char)read;
            }
            else{
               if( read == -1 || newChar == '\n' || newChar == '\r' ){
                  if( buffer.length() > 0 ){
                     buffer.append( last );
                     finish( prop, buffer );
                     buffer = new StringBuffer();
                     
                     read = jump( in, 1 );
                     newChar = (char)read;
                  }
               }
               else if( !(last == '\n') && !(last == '\r') )
                  buffer.append( last );
            }
         }
         
         last = newChar;
      }
      
      return prop;
   }
   
   private static int jump( InputStream in, int n ) throws IOException{
      int read = -1;
      
      for( int i = 0; i < n; i++ )
         read = in.read();
      
      return read;
   }
   
   private static void finish( Properties prop, StringBuffer buffer ) throws IOException {
      int index = buffer.indexOf( "=" );
      if( index == -1 )
         throw new IOException("Non valid line: " + buffer );
      
      String key = mini( buffer.substring( 0, index ) );
      String value = mini( buffer.substring( index+1 ) );
      
      if( key.length() == 0 )
         throw new IOException("Non valid key: empty" );
      
      prop.put( key, value );
   }
   
   private static String mini( String original ){
      while( original.endsWith( " " ) || original.endsWith( "\t" ))
         original = original.substring( 0, original.length()-1 );
      
      while( original.startsWith( " " ) || original.startsWith( "\t"))
         original = original.substring( 1 );
      
      return original;
   }
}
```



> // dies ist ein kommentar
> wert1 = 13
> wert2 = blupp
> wer/*kommentar */t3 = bla
> noch ein Schlüssel = super toll


----------



## analogo (24. Apr 2005)

hier die aktualisierung:


import java.io.*;
import java.util.*;

class sunsyn2
{
  public static void main(String args[])
  {
    Properties prop = new Properties();
    prop.load(new FileInputStream("sunsyn.ini"));
    System.out.println(prop.getProperty("test"));
  }
}


Compiliere D:\_1 sunsyn programm\java\test\sunsyn2.java mit Java-Compiler
sunsyn2.java:9: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
    prop.load(new FileInputStream("sunsyn.ini"));
              ^
sunsyn2.java:9: unreported exception java.io.IOException; must be caught or declared to be thrown
    prop.load(new FileInputStream("sunsyn.ini"));
             ^
2 errors


----------



## Roar (24. Apr 2005)

hier steht was die fehlermeldungen bedeuten: http://www.java-forum.org/de/viewtopic.php?t=3976
du musst exceptions abfangen


----------



## analogo (24. Apr 2005)

was mag er denn net an dem kleinen listing? 

in der datei sunsyn.ini steht nur folgendes:

test=13


----------



## Beni (24. Apr 2005)

Bekommst du eine Exception? 
Vielleicht musst du ein "ENTER" nach der 13 einbauen (ist zumindest bei Manifesten so, könnte hier ja auch sein).


----------



## analogo (24. Apr 2005)

die exceptions stehen in meinem vorletzten posting..
habs nochmal mit nem "enter" hinter 13 probiert. funzt auch net


----------



## Beni (24. Apr 2005)

Ach so, dachte du hast das schon korrigiert.

Dann versuchs mal so:

```
import java.io.*;
import java.util.*;

class sunsyn2
{
  public static void main(String args[])
  {
    try{
      Properties prop = new Properties();
      prop.load(new FileInputStream("sunsyn.ini"));
      System.out.println(prop.getProperty("test"));
    }
    catch( IOException ex ){
      ex.printStackTrace(); // hier wird der Fehler verarbeitet
    }
  }
}
```


----------



## Roar (24. Apr 2005)

ich sagte doch, du musst im code die exceptions abfangen!
lies mal hier: http://www.java-forum.org/de/javabuch/html/k100077.html#kapitelexceptions


----------



## analogo (24. Apr 2005)

ok, dann muss ich mich da wohl mal reinlesen.. hätt ja sein können, dass ihr eine idee habt, was ihn dabei stört


----------



## Beni (24. Apr 2005)

Haben wir doch gesagt? Sooo unverständlich drücken wir uns doch nicht aus?


----------



## analogo (24. Apr 2005)

natürlich habt ihr euch verständlich ausgedrückt!  das ganze macht mich nur total kribbelig, da ich schon seit 3 wochen daran gesessen habe, den byte-code vom synthesizer herauszubekommen und so langsam möcht ich das proggi fertigbekommen..


----------



## analogo (24. Apr 2005)

er hat es endlich gemacht mit deinem listing beni!! 

aber wieso muss er denn den fehler bearbeiten??


----------



## analogo (24. Apr 2005)

das problem ist nun, dass er die zahlen als string ausgelesen hat.. wie kann er es denn als zahlen auslesen?


----------



## analogo (24. Apr 2005)

hab mir nochmal das posting von roar genau durchgelesen.. jetzt macht er es.. 

sorry nochmal!!


----------

