Hi,
ich gehe mal davon aus, dass sich hier paar Informatiker/Programmierer befinden
Also ich hab ein Problem mit dem Einlesen einer Textdatei. Ich nutze dafür den BufferedReader und den FileReader. Mein Problem hierbei ist, dass ich zunächst über eine For-Schleife die Zeilenanzahl zählen lasse und danach in einer zweiten Schleife den Inhalt in einem Stringarray speichere. Dafür brauche ich aber komischerweise zwei Instanzen von BufferedReader. Ich kann nicht eine benutzen, da die zweite For-Schleife nach dem einmaligen Zählen der Zeilenzahl nur noch Mist einliest. Nutze ich dafür aber eine zweite Instanz, dann funktioniert das Einlesen einwandfrei. Gibt es eine Möglichkeit Zählen und Einlesen mit einer Instanz hinzubekommen?
Einfach mal den reader nach der ersten Schleife wieder an den Anfang des Streams schicken, schau dir mal die Funktionen mark(int irgendwas) und reset() der Klasse BufferedReader an.
oder statt einem array eine ArrayList oder sowas benutzen, die haben eine variable länge, d.h. du kannst einfach anfangen und jede zeile statt nur zu zählen auch gleich einfügen. brauchst somit keine 2 for-schleifen mehr...
für was brauchst du denn die zeilenzahl?
nimm dir einfach nen dynamisch wachsenden container (vector, list, o.ä.), ruf in einer schleife die methode readLine() vom BufferedReader auf und speicher das ergebnis jeweils im container.
Original von rawman81
für was brauchst du denn die zeilenzahl?nimm dir einfach nen dynamisch wachsenden container (vector, list, o.ä.), ruf in einer schleife die methode readLine() vom BufferedReader auf und speicher das ergebnis jeweils im container.
Wenn du noch wert auf Performance legst schätz die Datei ungefähr ab und gibs dem Konstruktor von ArrayList mit weil das erweitern kostet Zeit
Original von BigBiber
...weil das erweitern kostet Zeit![]()
sicher nicht bei ner verketteten liste![]()
agree... bei ner ArrayList haste natürlich recht ![]()
wenn man aber einfach nacheinander alle elemente in nen container speichern will, und danach jedes element 1x abarbeiten will ist ne verkettete liste halt am sinnvollsten.
was ist das bei java überhaupt nochmal? ist das die klasse List?
Ich hab es jetzt als ArrayList. Bietet sich auch mehr an als ein einfaches String Array, da ich ohnehin noch Objekte hinzufügen möchte und da ne dynamische Größe doch besser wäre. Naja, er zickt aber ein wenig rum beim einlesen...also meine Methode enthält im Moment das hier:
BufferedReader leser=new BufferedReader(new FileReader(filename));
while(leser.readLine() != null)
{
arraylist.add(leser.readLine());
}
Das ganze in nem TryCatch Block natürlich. Hierbei liest er jedoch nur Müll ein
Original von rawman81
Original von BigBiber
...weil das erweitern kostet Zeit![]()
sicher nicht bei ner verketteten liste![]()
kostet auch bei ner verketteten liste mehr zeit, weil's allokieren von speicher nunma aufwendig is und man dass da immer machen muss aber spielt in 99% aller fälle eh keine rolle ^^
Original von bunghole738
while(leser.readLine() != null)
{
arraylist.add(leser.readLine());
}
fehlt da nicht jede 2. zeile wenn du das so machst?
du liest ne zeile prüfst ob die null ist und dann liest du die nächste zeile und schreibst sie ins array.
vielleicht besser so:
String line;
while(line = leser.readLine() != null)
{
arraylist.add(line);
}
oder:
String line;
while(true)
{
line = leser.readLine();
if (line != null)
arraylist.add(line);
else break;
}
code ist nur mal eben schnell hingetippt, also ohne garantie
Original von bunghole738
Ich hab es jetzt als ArrayList. Bietet sich auch mehr an als ein einfaches String Array, da ich ohnehin noch Objekte hinzufügen möchte und da ne dynamische Größe doch besser wäre. Naja, er zickt aber ein wenig rum beim einlesen...also meine Methode enthält im Moment das hier:
BufferedReader leser=new BufferedReader(new FileReader(filename));while(leser.readLine() != null)
{
arraylist.add(leser.readLine());
}Das ganze in nem TryCatch Block natürlich. Hierbei liest er jedoch nur Müll ein
![]()
das problem ist, wenn ich mich jetzt nicht vertue, dass du so nur jede 2. zeile auch in die array list packst. bei while(leser.readLine() != null) wird ne zeile eingelesen, aber dann im block wieder die nächste.ich würde es so machen:
ArrayList<String> list = new ArrayList<String>(); while (leser.ready()) { String newLine = leser.readLine(); list.add(newLine); }
ja die ready() methode hatte mir noch gefehlt, damit ists natürlich noch eleganter
Vielen Dank für die vielen Vorschläge, hab jetzt mal den von TaZz genommen und der funktioniert. Das Problem war vorher, dass er tatsächlich nur jede zweite Zeile gelesen hat
Was genau macht denn ready() hier jetzt? Ich hab in der API nachgeschaut und ready() gibt einem zurück, ob ein Stream bereit ist gelesen zu werden. Heißt das, dass ready() so lange true ist wie es noch Zeilen zu lesen gibt?
Original von bunghole738
Heißt das, dass ready() so lange true ist wie es noch Zeilen zu lesen gibt?
genau, so hab ichs auch verstanden. sobald eof erreicht ist gibt ready() false zurück.
Ich hab nochmal ne weitere Frage
Wenn ich eine neue Textdatei erstellen will, wie mach ich das am besten? Mit FileWriter?
Original von bunghole738
Ich hab nochmal ne weitere FrageWenn ich eine neue Textdatei erstellen will, wie mach ich das am besten? Mit FileWriter?
new BufferedWriter(new FileWriter(new File("name.txt")));
existiert die datei noch nicht, wird sie angelegt. esxistiert sie bereits, steht dein filepointer am anfang der datei, schreibst du nun einfach was rein, wird der alte inhalt komplett überschrieben. also bei einer bereits existierenden datei, an die noch etwas angehängt werden soll, unbedingt ans ende der datei laufen.
achja, ob man das new File(...) im konstruktor vom filewriter braucht, weiß ich grad nicht, vllt kann man dem filewriter auch direkt den pfad zur datei übergeben
Dafür gibts ja die API-Doku...
Nachdem ein Konstruktor FileWriter(String) existiert, kann man sich das File-Objekt sparen.
Ach ja:
kostet auch bei ner verketteten liste mehr zeit, weil's allokieren von speicher nunma aufwendig is und man dass da immer machen muss aber spielt in 99% aller fälle eh keine rolle ^^
Allerdings ist das bei ner ArrayList deutlich aufwändiger, weil erst ein sehr großer Speicherbereich alloziiert werden muss (bei der Liste ist es jeweils nur ein Element), und man dann noch umkopieren darf.
Ach ja, wenn zwischendrin noch neue Elemente eingefügt werden sollen, dann ist LinkedList sehr viel schneller als ArrayList.