Aus .txt samt Zeilenumbrüche auslesen

PsychedelicSpark

Grünschnabel
Hallo Zusammen

Ich habe schon in hunderten von Foren nach einer Lösung gesucht, jedoch ohne Erfolg. Daher habe ich mich aus Verzweiflung hier angemeldet, in der Hoffnung, dass mir jemand bei meinem Problem helfen kann.


Grundsätzliches zu meinem Programm:
Es handelt sich hierbei um ein Programm, welches Notizen erstellen, anzeigen, bearbeiten, löschen und abspeichern kann. Das Ganze als GUI mit Java Swing.
Beim speichern der Notizen werden die Werte "Priorität", "Titel" und "Inhalt" aus JTextAreas ausgelesen und zeilenweise (in dieser Reihenfolge) in eine .txt Datei rein geschrieben.
Beim erneuten Start des Programms sollen alle Notizen, die in die .txt geschrieben wurden, wieder schön in einer JList(über ein DefaultListModel) angezeigt werden.
Die Notizen werden in einem Vector gespeichert.

Nun zu meinem Problem:
Ich lese die Daten zeilenweise per BufferedReader aus der .txt Datei raus (in einer while Schleife, versteht sich).
Das Problem ist nur, dass ich die jeweils nächste Zeile mit einer while Schleife nicht so recht auf etwas überprüfen kann.
Ich möchte das tun, da der Inhalt einer Notiz auch Zeilenumbrüche enthalten kann und ich auch nicht im Vorhinein weiss, wie viele darin vorkommen könnten.

Ich habe das Ganze wie folgt probiert:
PHP:
file = new File("Notizen.txt");
			
BufferedReader reader;
try
	{
		reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
				
		try
		{	
			while(reader.readLine()!=null)
			{
				poke=reader.readLine();
				poke2=reader.readLine();
				while(reader.readLine().startsWith("Niedrig")==false||reader.readLine().startsWith("Mittel")==false||reader.readLine().startsWith("Hoch")==false)
					poke3+=reader.readLine();
						
				Notiz notiz = new Notiz(poke, poke2, poke3);
				notiz.setStrPriority(poke);
				notiz.setStrTitel(poke2);
				notiz.setStrInhalt(poke3);
				vector.addElement(notiz);
					if(poke.equals("Hoch"))
						dlmHoch.addElement(poke2);
					if(poke.equals("Mittel"))
						dlmMittel.addElement(poke2);
					if(poke.equals("Niedrig"))
						dlmNiedrig.addElement(poke2);
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	catch (FileNotFoundException e1)
	{
		e1.printStackTrace();
	}
Dabei wirft mir Eclipse aber eine NullPointerException bei der Abfrage per while Schleife vor :(

Ich weiss echt nicht mehr weiter und wäre euch sehr dankbar, wenn ihr mir helfen könntet.

EDIT: Anscheinend springt der BufferedReader tatsächlich auf die nächste Zeile, wenn man in der Bedingung der while Schleife readLine() überprüft.
 
Zuletzt bearbeitet:
Moin,

ich denke mal, dass Du ein paarmal zuoft das readline aufrufst.

Ich würde es so machen:
Java:
String line;

f = new BufferedReader( new FileReader(strFileName) );

while ( (line = f.readLine()) != null) 
{
     if ( !line.startsWith("AA") &&  !line.startsWith("ZZ) ) 
    {
// ...
    }
}

Gruß
Klaus
 
Hallo,

reader.readLine() liest immer weiter aus der Datei aus, auch wenn es innerhalb der while-Bedingung aufgerufen wird. Irgendwann ist das Ende der Datei erreicht und es kommt null zurück.
Falls du mehrere Zeilen zwecks parsing einlesen willst, dann speichere die Zeilen in temporären Variablen und überprüfe die Variablen im weiteren Verlauf, statt weiter den reader auszulesen.

Ansonsten, je mehr lauffähigen Code und Beispiel Textdateien du postest, desto eher kann man helfen.
 
Ssso.
Das kommt mir zwar etwas gar ercheatet vor, aber immerhin mal eine funktionierende Lösung (wenn auch keine sehr schöne):
Java:
file = new File("Notizen.txt");
BufferedReader reader;
			
	try
	{
		reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
				
		try
		{
			check=false;
			check2=false;
			while((po=reader.readLine())!=null)
			{		
				if(po.startsWith("Niedrig")||po.startsWith("Mittel")||po.startsWith("Hoch"))
				{
					if(check==true && check2==false)
					{
						Notiz notiz = new Notiz(poke, poke2, poke3);
						notiz.setStrPriority(poke);
						notiz.setStrTitel(poke2);
						notiz.setStrInhalt(poke3);
						vector.addElement(notiz);
						if(poke.equals("Hoch"))
							dlmHoch.addElement(poke2);
						if(poke.equals("Mittel"))
							dlmMittel.addElement(poke2);
						if(poke.equals("Niedrig"))
							dlmNiedrig.addElement(poke2);
								
						check=false;
					}
					else if(check==true && check2==true)
					{
						Notiz notiz = new Notiz(poke, poke2, poke3);
						notiz.setStrPriority(poke);
						notiz.setStrTitel(poke2);
						notiz.setStrInhalt(poke3);
						vector.addElement(notiz);
						if(poke.equals("Hoch"))
							dlmHoch.addElement(poke2);
						if(poke.equals("Mittel"))
							dlmMittel.addElement(poke2);
						if(poke.equals("Niedrig"))
							dlmNiedrig.addElement(poke2);
								
						check=false;
						check2=false;
					}
					poke=po;
				}
				if(po.startsWith("Titel:"))
				{
					poke2=po;
					poke2 = poke2.substring(6);
				}
				if(!po.startsWith("Niedrig")&&!po.startsWith("Mittel")&&!po.startsWith("Hoch")&&!po.startsWith("Titel:"))
				{
					if(po.startsWith("Inhalt:"))
					{
						poke3 = po;
						poke3 = poke3.substring(7);
						check = true;
					}
					else
					{
						poke3+=ls+po;
						check2 = true;
					}
				}
			}
			//2 Abfragen für die letzte Notiz
			if(check==true && check2==false)
			{
				Notiz notiz = new Notiz(poke, poke2, poke3);
				notiz.setStrPriority(poke);
				notiz.setStrTitel(poke2);
				notiz.setStrInhalt(poke3);
				vector.addElement(notiz);
				if(poke.equals("Hoch"))
					dlmHoch.addElement(poke2);
				if(poke.equals("Mittel"))
					dlmMittel.addElement(poke2);
				if(poke.equals("Niedrig"))
					dlmNiedrig.addElement(poke2);
						
				check=false;
			}
			if(check==true && check2==true)
			{
				Notiz notiz = new Notiz(poke, poke2, poke3);
				notiz.setStrPriority(poke);
				notiz.setStrTitel(poke2);
				notiz.setStrInhalt(poke3);
				vector.addElement(notiz);
				if(poke.equals("Hoch"))
					dlmHoch.addElement(poke2);
				if(poke.equals("Mittel"))
					dlmMittel.addElement(poke2);
				if(poke.equals("Niedrig"))
					dlmNiedrig.addElement(poke2);
						
				check=false;
				check2=false;
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	catch (IOException e1)
	{
		e1.printStackTrace();
	}
Ich habe einfach in der .txt Datei vor den Informationen "Titel" und "Inhalt" einen Präfix mitgegeben und die Zeilen jeweils darauf überprüft und den String gesplittet.
Um zu überprüfen, ob der Inhalt der Notiz Zeilenumbrüche enthält, habe ich 2 booleans verwendet.
Zu guter Letzt noch 2 weitere if Abfragen nach der while Schleife für die letzte Notiz (da das Programm ja die Schleife beendet, wenn es zur letzten Zeile angelangt ist > [ und besonders darum finde ich meine Lösung nicht gerade die Schönste... Ganz zu schweigen von den 2 booleans.. ]).

Naja.. Fürs Erste bin ich aber ganz zufrieden damit, dass es läuft :D

Ein ganz dickes Dankeschön an euch beide!
Ihr habt mir echt geholfen! :)
 
Zuletzt bearbeitet:
Zurück