Java Logisches Problem, Textzeilen zwischen zwei Strings auslesen

Timmey92

Commodore
Dabei seit
Okt. 2008
Beiträge
4.478
Moin!

Habe ein kleines logisches Problem...
Ich habe eine Text datei mit verschiedenen Datensätzen, welche durch
einen START string und einen END String begrenzt werden. Und zwischen diesen stehen dann die informationen.

Ich habe bisher die Textzeilen in einem Array gespeichert. Dann habe ich eine schleife gebaut um das array nach dem start string zu durchsuchen. Eine zweite Schleife innerhalb der ersten schleife soll dann weitermachen und die Zeilen bis zum End string in einem zweiten array speichern.
Allerdings klappt das nicht so ganz ...

Code:
		FileReader fileReader;
		try 
		{
			fileReader = new FileReader(Verbindungsdatendatei);
			BufferedReader  bufferedReader = new BufferedReader(fileReader);
			
			ArrayList datensätze = new ArrayList();
			
			while(bufferedReader.ready())
			{
				datensätze.add(bufferedReader.readLine());
			}
			
			for (int i=0; i!= datensätze.size();i++)
			{
				String zeile = (String)datensätze.get(i);
				ArrayList tempdatensätze = new ArrayList();
				
				if(zeile=="CONNECTION_DATA_START")
				{
					for(;;)
					{
						i++;
						String nächstezeile = (String)datensätze.get(i);
						tempdatensätze.add(nächstezeile);
						System.out.println(nächstezeile);
						if(nächstezeile=="CONNECTION_DATA_END")
						{
							break;
						}
					}
				}
			}
		} 
		catch(FileNotFoundException e)
		{
			System.out.println("Datei-nicht-gefunden: "+ e.getMessage());
		}
		catch(IOException e)
		{
			System.out.println("Ein-Ausgabe-Fehler: " + e.getMessage());
		}
Wo liegt mein Fehler?? :S
 

BerniG

Lieutenant
Dabei seit
Okt. 2004
Beiträge
620
Ich hätte das jetzt so implementiert (ungetestet):
Code:
FileReader fileReader;
try {
	fileReader = new FileReader(Verbindungsdatendatei);
	BufferedReader  bufferedReader = new BufferedReader(fileReader);
	
	ArrayList<String> ergebnis = new ArrayList<String>();
	bool inEntry = false;     // signalisiert ob man momentan in einem Eintrag ist oder nicht
	String line = bufferedReader.readLine();
	StringBuilder sb = new StringBuilder ();
	while(line != null){
		// innerhalb eines Eintrags?
		if(inEntry){
			// bei CONNECTION_DATA_END Daten in Ergebnisarraylist speichern
			if(line.equals("CONNECTION_DATA_END"){
		 		if(sb.length() > 0) ergebnis.add(sb.toString());     // wenn sich was angesammelt hat, dann hinzufügen
			 	sb.setLength(0);    // effizient "leeren"
			 	inEntry = false;
			} else sb.append(line).append("\n");       // einfach anhängen
		// außerhalb eines Eintrags wird alles verworfen. Nur bei einem CONNECTION_DATA_START wird ein neuer Eintrag begonnen!
 		} else if (line.equals("CONNECTION_DATA_START")){        
			inEntry = true;
		}
 		line = bufferedReader.readLine();      // nächste Zeile lesen
	}
	if(inEntry && sb.length() > 0) ergebnis.add(sb.toString());   // Rest hinzufügen falls letztes CONNECTION_DATA_END fehlt; kann man auch weglassen
} catch(FileNotFoundException e) {
	System.out.println("Datei-nicht-gefunden: "+ e.getMessage());
} catch(IOException e) {
	System.out.println("Ein-Ausgabe-Fehler: " + e.getMessage());
}
Im Ergebnisarray wären die Logeinträge dann einzeln gespeichert.

Ein großer Fehler bei dir ist der Stringvergleich mit "==". Außerdem sehe ich nirgends wo du einen Wert endgültig speichern würdest
 
Zuletzt bearbeitet:

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.478
string vergleich mit == geht nicht?
okay ... komme eigentlich von c# ^^ ist heute der erste tag mit java ...

danke, dein ansatz hat mir sehr geholfen! werde das jetzt selbst probieren ...
 

BerniG

Lieutenant
Dabei seit
Okt. 2004
Beiträge
620
== überprüft in Java die Objektidentität. Also letztlich nur ob zwei Objekte an derselben Speicheradresse liegen. Bei primitiven Typen(int, bool, char usw.) kann man natürlich das "==" hernehmen, bei den entsprechenden Objekttypen(Integer, Boolean usw.) muss man aber wiederum zwingend equals() verwenden! Des Weiteren gibts dann noch die compareTo()-Methode wenn man größer/kleiner haben will.

Achtung: Jedes Objekt hat equals() implementiert aber nicht jedes Objekt hat compareTo() (nur wenn das Comparable-Interface implementiert wurde). Des Weiteren sollte die Javadoc zu einem Objekt angeschaut werden bevor man equals() oder compareTo() verwendet, um die genau implementierte Vergleichsart rauszukriegen. Bei "Standardklassen" wie String kann man sich das aber natürlich sparen ;)
 

Timmey92

Commodore
Ersteller dieses Themas
Dabei seit
Okt. 2008
Beiträge
4.478
suuper innerhalb der methode klappt jetzt alles :)
ich habe eine arraylist mit den zeilen (stringbuiler fand ich nich so klasse :)) ... damit kann ich nun weiterarbeiten, danke!
 

ljnk

Lt. Junior Grade
Dabei seit
Mai 2008
Beiträge
345
auch in .net dürfte ein stringvergleich mit == problematisch werden. meistens klappts, da in der vm ein bestimmter pool an strings existiert und gleiche ("asd" "asd") strings nur einmal angelegt werden. unter bestimmten umständen hauts aber eben nicht hin. ziemlich unschöne fehlerquelle.

.equals() ist übrigens bei den meisten implementierungen einfach nur ein == und möchte überschrieben werden, sofern nicht innerhalb des frameworks schon passiert.

//edit:
whoops, gerade nochmal ordentlich schlau gemacht und tada: kein problem in .net, bei strings ist der == operator nämlich überschrieben und ruft .equals() auf. trotzdem im grunde die gleiche technik in java und .net, lediglich der kleine tweak macht den unterschied.
 
Zuletzt bearbeitet:
Top