PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java : Frage zum FileReader


Tiamat
2008-05-22, 17:46:17
Hi,
wenn ich mittels FileReader ein Dokument durchforste und nach gewissen Einträgen suchen möchte, benutze ich doch den FileReader.
File document = new File("/users/bla/bla.txt");
FileReader fr = new FileReader(document);
BufferedReader buffered = new BufferedReader(fr);
String line;

if(document.exists()) {
line = buffered.readLine();
if(line != null) {
System.out.println(line); // Erstmal die erste Zeile ausgeben

while(line != null) {
line = buffered.readLine(); // dann alle weiteren ausgeben

}
}
}
buffered.close();

Jetzt ist das Problem, wenn es sicher auch Dokumente gibt, die für Absätze und/oder Layout mehr als 5 Zeilen ohne Inhalt haben.
Klar ich könnte jetzt zum Beispiel einen Zähler initialisieren, der für jede leere Zeile einmal erhöht wird und bei einer Anzahl von z.b 10 Leerläufen die Schleife beendet.
Jetzt stelle sich vor, man wollte auf diesem Weg nachträglich Einträge eine in Liste vornehmen , die nach aufsteigenden Datum oder nach Benutzernummern sortiert ist.
Sowas wäre doch dann der reinste Kampf oder ;D
Ok mal Spaß beiseite, geht das nicht ne Spur komfortabler bzw. gibt es noch ne andere Möglichkeit außer den FileReader?

Monger
2008-05-22, 18:38:39
Ich versteh dein Problem nicht so recht. Ich bin nichtmal sicher, ob du es selbst wirklich verstehst.

Dein Reader läuft ja solange, bis null zurückkommt. Eine Leerzeile ist NICHT null!
Ein leerer String ist nicht gleichbedeutend mit keinem String.

Im übrigen gibt es wirklich was bequemeres als den FileReader, mal sehen ob ich das wiederfinde...


Edit: Ja, das ist er doch...
Die Scanner (http://java.sun.com/javase/6/docs/api/java/util/Scanner.html) ist eine Kreuzung aus Reader und Parser. Da kannst du dir natürlich auch eine Zeile nach der anderen ausgeben lassen, aber du kannst auch im Text suchen und Matches von irgendwelchen regulären Ausdrücken rausfischen.

Tiamat
2008-05-22, 20:07:46
Ja das ein leerer String ungleich null ist, war mir bewusst.
Ich habe , als ich mit dem FileReader und FileWriter herumgespielt habe, ständig die Null Referenz erhalten und zwar an den Stellen, an dem kein Eintrag im Dokument war.
Anscheinend wird in einem leeren Dokument und an Stellen ,an denen sich kein Eintrag befindet, der Variable kein Wert zugewiesen, sondern nur wenn sich dort Zeichen befinden.
Daher wurde der String noch nicht initialiert und liefert somit die Null-Referenz zurück. Das wird wohl eine gewollte Eigenschaften der FileReader/FileWriter sein.
Das mit dem Scanner ist allerdings sehr interessant. Ich benutze ihn immer in Verbindung mit (System.in) , auf die Idee wäre ich so schnell nicht gekommen.

Monger
2008-05-22, 20:14:25
Hm, sorry, das hab ich nicht geahnt. Dass der Reader einfach mal zwischendrin null zurückgibt, ist schon äußerst merkwürdig.

Bei ReadLine steht nunmal:

Returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached.

shink@dillo
2008-05-22, 21:04:56
Ja das ein leerer String ungleich null ist, war mir bewusst.
Ich habe , als ich mit dem FileReader und FileWriter herumgespielt habe, ständig die Null Referenz erhalten und zwar an den Stellen, an dem kein Eintrag im Dokument war.
Anscheinend wird in einem leeren Dokument und an Stellen ,an denen sich kein Eintrag befindet, der Variable kein Wert zugewiesen, sondern nur wenn sich dort Zeichen befinden.
Daher wurde der String noch nicht initialiert und liefert somit die Null-Referenz zurück. Das wird wohl eine gewollte Eigenschaften der FileReader/FileWriter sein.
Nein, da stimmt irgendetwas nicht. Das macht der FileReader nicht.
Da geht irgendetwas schief.

Sephiroth
2008-05-22, 23:19:54
Ist dir schonmal aufgefallen, dass du in deiner while-Schleife die Ausgabe vergessen hast und deswegen nichts mehr ausgegeben wird? ;)

Berni
2008-05-23, 12:36:50
Normal mache ich die Schleife so:
while ((line = buffered.readLine()) != null) {
System.out.println(line);
}