RandomAccessFile sehr langsam bitte um Hilfe

ottens

Mitglied
Hallo an alle,

ich habe ein TextFile, dort werden bestimmte Zeichen auftauchen, ich möchte die Stellen der Zeichen bestimmen bzw speichern damit ich ab der Stelle das File lesen kann.
Java:
RandomAccessFile raf = newn RandomAccesFile(Filepfad, LeseZugriff);

     String zeile ;
     long pos= 0;
     while (raf.getFilePointer() < raf.length()) {
			pos = raf.getFilePointer();
			zeile = raf.readLine();
			if (zeile.equals("****")) {
				stellen[i] = pos;
				i++;
			}
		}
usw

die Methode readLine() ist sehr langsam gibt es Mölichkeit, womit ich das Programm beschleunigen kann

bedanke mich im voraus

Ottens
 
Zuletzt bearbeitet von einem Moderator:
Hi,

du könntest andere Klassen zum Lesen der Datei verwenden, die auf einer niedrigeren Schicht arbeiten. Grob fällt mir da als erstes der FileInputStream ein. Mit Hilfe der read() Methode kannst du Byte-Weise arbeiten.

Wenn du trotzdem Zeilenweise arbeiten möchstest, dann kannst du mal den BufferedReader probieren.

Grüße,
BK
 
die Klasse FileInputStream und mit Hilfe der read() Methode kann amn auch lesen aber liefer die read() Methode einen Text bzw String, dass man auf **** prüfen kann ****?

es geht um ein File, dort stehen echt tausende zeilen je ca. 100 Zeilen tauchen die
zeichen "***" als eine eigenständige Zeile auf die ich ihre Stelle im File bestimmen muss, daher

danKe euch also beim feststellen wo die einzelne Zeichen im File stehen, muss nich RandomAccessFile sein Haupsache wird die Position der Zeichen *** richtig festgestellt aber beim Lesezugriff auf beliebuige Stelle dann hilft nur RandomAccessFile
 
Zuletzt bearbeitet:
danKe euch also beim feststellen wo die einzelne Zeichen im File stehen, muss nich RandomAccessFile sein Haupsache wird die Position der Zeichen *** richtig festgestellt aber beim Lesezugriff auf beliebuige Stelle dann hilft nur RandomAccessFile

Sag' mir, wenn ich mich irre, aber im obigen Code tust du doch auch nichts anderes als den FilePointer immer auf den Anfang einer Zeile zu setzen. Wieso kannst du dann nicht etwas gleichartiges mit getLineNumber() und setLineNumber() schreiben?
 
dewegen frage ich, kann ich mit der Klasse LineNumberReader Zeilenweise springen,weil ich
nur den Block zwischen *** und *** brauche, wenn JA dann das wäre auch eine Lösung.
 
Hi Thomas danke dir also die Datei soll beliebig gross sein aber, die ich momentan damit teste
690 MB gross aber es gibt kleiner aber es kann sein dass manche Files gross werden bzw
grosser als 690 MB oder doppel so gross.

Danke
 
Hallo,

eine Möglichkeit wäre die Datei über einen BufferedInputStream(FileInputStream(File)) einzulesen. Dabei liest du bei jedem Leseschritt Daten in einen Buffer ein (byte[]). Standardmäßig ist der Buffer AFAIK 8192 bytes - hier könntest du auch etwas höher gehen...
Den Buffer durchscuhst du dann nach dem entsprechenden byte Pattern, wobei du dir die jeweils bis zu diesem Zeitpunkt gelesenen bytes aufsummierst -> Dies ist dein "Filepointer" -> long verwenden!

Hast du dein Pattern merkst du dir diese Position (-> Dies ist dann deine "Start"-Position vom Anfang der Datei aus gesehen) und liest alles bis zum "ende"-Pattern - dort merkst du dir wieder die Position).

Beim FileInputStream kannst du dann via skip(n) eine Anzahl von n-Bytes Skippen -> So kannst du zum entsprechenden vorkommen des Patterns springen.

Eine andere Möglichkeit wäre die große Datei in kleineren logischen Blöcken auszulesen (zBsp. via: MappedByteBuffer <- RandomAccessFile(...).getChannel().map(FileChannel.MapMode.READ, blockStartPos, 32MB) und die Blöcke dann im Speicher zu durchsuchen.

Ich denke aber die erste Möglichkeit sollte ausreichen - müsstest du aber erst ausprobieren.

Können sich die Daten ändern? Wenn nicht würde ich die Informationen einmal auslesen und diese dann in einer anderen Datei abspeichern - so musst du nicht immer die Komplette Datei durchsuchen.

Gruß Tom
 
danke Thomas, das File wird einmal gelesen die Stellen wo *** steht wird in einem long Array gespeichert dann wenn man bestimmten Block lesen möchte wird zur Adresse gesprungen, die in diesem long Array gespeicherte Adresse. Werde aber dein Vorschlag testen.

danke
 
Zurück