BufferedReader br.readLine();

Status
Nicht offen für weitere Antworten.

julchen81

Bekanntes Mitglied
Guten Morgen!

ich lese Zeile für Zeile aus einer Datei:

while ((row = br.readLine()) != null) {...}

Innerhalb dieser while-Schleife befindet sich noch mal dieselbe while-Schleife. Ich suche nämlich in meinem Text nach einem String, habe ich diesen dann gefunden, suche ich nach allen weiteren Vorkommen dieses Strings. Bin ich dann unten angelangt, möchte ich von vorne beginnen und dasselbe Spielchen mit einem anderen String durchführen.

Ich möchte also, dass - wenn mit der inneren while-Schleife die letzte Dateizeile erreicht ist - wieder dort weitergelesen wird, wo die erste while-Schleife noch steht.

Wie bitte geht das? Dadurch, dass ich mit der inneren while-Schleife so weit gehe, bis ich das Dateiende erreicht habe, ergibt die Bedingung ((row = br.readLine()) != null) in der ersten while-Schleife auch false und ich kann nicht mehr von vorne durchlesen.

Schönen Tag, :wink:
Julia
 

The_S

Top Contributor
Speicher die Datei zeile für Zeile zuerst in z. B. einer ArrayList ab und bearbeite diese dann.
 
D

dumbi

Gast
Hallo Julia,

weise doch am Anfang dein readLine() 2 unterschiedlichen Variablen zu. Die eine benutzt du in der äußeren Schleife die andere in der inneren.

Weiß nicht ob es klappt bin selber noch anfänder und kann es gerade nicht testen...

Gruß
 

quippy

Bekanntes Mitglied
Du kannst den Stream zwei mal öffnen. Einmal für innen und einmal für außen. Allerdings möchtest Du ja dort mit der inneren Schleife beginnen, wo die äußere angehalten hat.

Da bleiben Dir zwei Möglichkeiten:
a) Alles in den Speicher lesen, wie bereits vorgeschlagen, und dann dort suchen (bei großen Dateien wird das ekelig)
b) statt eines Readers (mit readline) benötigst Du einen RandomAccessStream der "seeking" kann. Damit kannst Du !nur! Dateien lesen, keine URL (also Net-Streams, da die das nicht können).
Dann hast Du zwar keine readline-Funktion, aber die ist schnell selbst gebaut - wenn Du die überhaupt benötigst. Ggf. kommst Du mit einem Stream besser hin und liest immer eine fixe Anzahl bytes zum Durchsuchen.
 

julchen81

Bekanntes Mitglied
sch..... ade, ich dachte, das geht praktischer.

Dann probier ich mal, jede Zeile in einer ArrayList abzuspeichern und diese dann zu durchsuchen.
Meine Datei besteht aus knapp 92500 Zeilen, was meint ihr dazu, ist diese Größe noch tragbar?

LG Julia
 

The_S

Top Contributor
und wie lang sind diese Zeilen? Könnte unter Umständen mit den Standardmäßigen 64MB VM-Speicher knapp werden.
 

julchen81

Bekanntes Mitglied
Hallo,

also das Programm läuft, macht alles ganz brav... braucht allerdings rund 3min, bis es durch ist.
Wichtig ist mir nur das Ergebnis, also von daher passt es.
Allerdings würd's mich schon interessieren, wenn jm. eine bessere und schnellere Idee hätte... :D

Julia
 

julchen81

Bekanntes Mitglied
quippi hätte ja schon einen Vorschlag gemacht, aber ich bin noch nicht lange im Geschäft und versteh kaum was von dem was er schreibt :oops:

Julia
 

Quaxli

Top Contributor
Der Vorschlag von Hobbit_im_Blutrausch scheint mir der geschicktere Weg zu sein, als mit 2 Streams rumzufrickeln. Zumindest so vom Bauchgefühl her...
 

Janus

Bekanntes Mitglied
der vorschlag ist aber nicht sehr praktikabel, wenn die datei sehr gross werden kann.

weisst du bereits vorher, welche menge an strings du suchen willlst? dann wäre es meiner ansicht nach sinnvoller, einfach alle strings "auf einmal" zu suchen.
 

julchen81

Bekanntes Mitglied
Guten Morgen,

ja, ich weiß wieviele Strings ich durchsuchen will:
meine Datei besteht aus knapp 92500 Zeilen, jede Zeile à ca. 40 Zeichen bzw. 7 token.

Meine Lösung braucht ca. 3min, bis das Programm durch ist.

Was meinst du bitte mit "einfach alle strings auf einmal" suchen?

Julia
 

Janus

Bekanntes Mitglied
du willst doch das vorkommen aller strings jeweils für die gesamte datei bestimmen. also kannst du jede zeile nach jedem gesuchten string durchsuchen und dir die ergebnisse merken. so wird die datei insgesamt nur einmal eingelesen, ohne aber vollständig im speicher liegen zu müssen.
 

Oli

Top Contributor
Hallo Julia,

Janus hat recht. Und wenn du dir die Position merken musst kannst du dir ja einen Vektor basteln, in dem zu zum Beispiel dann auch die Position (mußt halt nen Spalten und Zeilenzähler mit implementieren merken kannst). Das wäre dann sinnvoll, wenn der gesuchte Text später merkiert werden müsste.

Grüße Oli
 

Oli

Top Contributor
Ja, ein Möglichkeit, allerdings dürfte das ziemlich Wurst sein, ob ich die Position in einem Array, Point oder Vecor speichere, kommt drauf an, wie und wo ich später diese gefundenen Strings identifizieren möchte.
 

julchen81

Bekanntes Mitglied
naja, ich suche ja nicht nur nach der Anzahl, wie oft so ein String vorkommt.

Z.B. finde ich in der ersten Zeile den String I2345. Dahinter stehen noch 6 Variablen.
In einer neuen Datei möchte ich dann in einer Zeile diesen String mit allen Variablen abspeichern.
Taucht I2345 noch in anderen Zeilen meiner Ausgangsdatei auf - mit weiteren Variablen dahinter - möchte ich in meiner neuen Datei diese Variablen zu der bisherigen Zeile hinzufügen.

Also jetzt noch mal exaktes Beispiel:
in meiner Ausgangsdatei steht:
I2345 a1 b2 c3 d3 e4 f5 g6
.......
I2345 a2 b6 c8 d9 e6 f1 g9

dann möchte ich in meiner Zieldatei haben:
I2345 a1 b2 c3 d3 e4 f5 g6 a2 b6 c8 d9 e6 f1 g9

Bemerkung:
die Variable I2345 kann beliebig oft auftauchen, auch mehrere hundert mal.


Julia
 

Oli

Top Contributor
Hallo Julia,

Ok, dann machste das erst recht mit einem Vector:

Zeile lesen -> String gefunden -> vector.add(die 6 Variablen)

Und in deine neue Datei schreibst du dann nur noch die Variable und läßt dir den Vector über ne for - Schleife auslesen.

Ist denk ich die einfachste und schnellste Methode.

Grüße Oli
 

julchen81

Bekanntes Mitglied
Vielleicht steh ich jetzt auch auf dem Schlauch, aber....

was ändert das dann an meinem Ausgangsproblem?
Ich brauche doch nach wie vor die beiden while-Schleifen?!

Julia
 

Oli

Top Contributor
Hallo Julia,

würde ich nicht sagen, wenn ich das Problem richtig verstanden habe, willst du in der Datei einen (oder eben mehrere) vorgegebene Strings identifizieren und dann die dahinterstehenden Werte in eine neue Datei schreiben, oder hab ich was falsch verstanden.

Grüße Oli
 

Oli

Top Contributor
Ja.

Wenn du ein bisschen warten kannst schick ich dir den Code. Wäre aber net schlecht, wenn ich vorher von dir dir Datei zum auslesen hätte, damit ich das auch schnell testen kann. Meine email-Addi hab ich dir in einer privaten Nachricht geschickt.

Grüße Oli
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K BufferedReader.readLine erkennt Zeilenende nicht Allgemeine Java-Themen 11
A bufferedReader readline, encoding Allgemeine Java-Themen 5
V wie bufferedreader.readline() unterbrechen? Allgemeine Java-Themen 4
D BufferedREader#readLine Allgemeine Java-Themen 20
conan2 BufferedReader.readLine() von anderem Thread aus beenden Allgemeine Java-Themen 4
N readLine() von BufferedReader hält das Programm fest/auf! Allgemeine Java-Themen 10
W Socket.setSoTimeout -> BufferedReader -> Default value Allgemeine Java-Themen 4
kodela Unterschiedliches Verhalten von BufferedReader Allgemeine Java-Themen 3
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
A BufferedReader ohne System.in Allgemeine Java-Themen 9
J BufferedReader Datei einlesen Allgemeine Java-Themen 8
Messoras Der BufferedReader mag mich nicht Allgemeine Java-Themen 47
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
J BufferedReader OutOfMemory umgehen? Allgemeine Java-Themen 10
B Input/Output BufferedReader Allgemeine Java-Themen 3
O BufferedReader von ganz unten anfangen zu lesen Allgemeine Java-Themen 7
S BufferedReader/PrintWriter an einer HTML Allgemeine Java-Themen 6
M BufferedReader: Vom Logfile zur Datenbank Allgemeine Java-Themen 6
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
D 'InputStreamReader' & 'BufferedReader' führen zu "cannot find symbol"-Fehler Allgemeine Java-Themen 3
D Scanner leer aber bufferedReader nicht?! Allgemeine Java-Themen 2
Developer_X Java BufferedReader mit URL Allgemeine Java-Themen 5
Semox Fehler - Zuweisung aus BufferedReader an Variable Allgemeine Java-Themen 3
S Exception beim BufferedReader Allgemeine Java-Themen 3
G getFilePointer in BufferedReader? Allgemeine Java-Themen 2
D (BufferedReader) inLine() "verschluckt" zeilen ? Allgemeine Java-Themen 2
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
W Frage zu BufferedReader Allgemeine Java-Themen 2
K Wie kann ich einen BufferedReader beschleunigen? Allgemeine Java-Themen 4
B while mit BufferedReader beenden Allgemeine Java-Themen 5
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
S BufferedReader problem Allgemeine Java-Themen 11
D BufferedReader in image umwandeln Allgemeine Java-Themen 3
M BufferedReader input - hängt sich auf Allgemeine Java-Themen 4
C Probleme mit URL und BufferedReader Allgemeine Java-Themen 6
C BufferedReader oder DataInputStream Allgemeine Java-Themen 4
M Store a String in a BufferedReader Allgemeine Java-Themen 2
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
S readLine() liest nur jede 2. Zeile Allgemeine Java-Themen 3
P readLine() liest nur jede dritte Zeile? Allgemeine Java-Themen 3
J RandomAccessFile readLine(); Allgemeine Java-Themen 5
S Stream ReadLine() Allgemeine Frage Allgemeine Java-Themen 5
S readLine oder sowas? Allgemeine Java-Themen 13
R read/readline blockiert Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben