RandomAccesFile langsam

ottens

Aktives 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 RandomAccessFile(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öglichkeit, womit ich das Programm beschleunigen kann

bedanke mich im voraus

Ottens
 
RandomAccessFile scheint nicht zu cachen/ buffern, liest jedes Zeichen einzeln, das ist natürlich unmöglich langsam

der Standard unter den simplen Klassen ist
BufferedReader readLine() example

BufferedReader liest immer gleich Tausende Zeichen auf einmal
 
Danke für die Antwort mein Problem liegt daran, dass ich die Adresse von den Zeichen
Java:
 "***"
in Array speichern möchte für die zukunftige Lesezugriffe, BufferedReader kann leider die Adresse von den Zeichen mir nicht holen.

es gibt I/O Klassen die als Brücke dienen bin ich mir aber nicht sicher welche Kombination von Klassen passen.

Danke
 
Zuletzt bearbeitet:
wenn es eine Datei mit fester Kodierung ist, 2 Bytes für ein Zeichen oder so, dann kann man auch bei BufferedReader die Zeichen mitzählen,

oder auch: mit BufferedInputStream die bytes cachen,
darauf ein eigener Zwischenstream X, der bei jedem read() eines Bytes mitzählt,
darauf einen InputStreamReader im passenden Encoding bzw. den Default belassen

und von diesem mit read() einzeln Zeichen lesen,
dann muss man sich um Zeilenumbruch selber kümmern,
allzu viel Magie macht BufferedReader dazu aber auch nicht:

Java:
		for (i = nextChar; i < nChars; i++) {
		    c = cb[i];
		    if ((c == '\n') || (c == '\r')) {
			eol = true;
			break charLoop;
		    }
		}
RandomAccessFile ähnlich
Java:
while (!eol) {
	    switch (c = read()) {
	    case -1:
	    case '\n':
		eol = true;
		break;
	    case '\r':
		eol = true;
zwischen den Zeilen beim X nachfragen, welche Position gerade erreicht ist
 
also du meinest wenn man readChar() benutzt, wird 1 Byte oder 2 Byte gelesen dadurch kann man die ByteNr. von dem aktuellen Zeichen im File bestimmen ?

werde testen aber wie ist das wenn man die einzelne Zeichen nicht als TEXT bzw String bekmmt sondern als Folge von
Hexzahlen ??

Danke
 
> also du meinest wenn man readChar() benutzt, wird 1 Byte oder 2 Byte gelesen dadurch kann man die ByteNr. von dem aktuellen Zeichen im File bestimmen ?

wenn es immer dieselbe Anzahl wäre, könnte man von der relativ leicht zählbaren Zeichenanzahl (herausgeschnittene Zeilenumbrüche nicht vergessen!) auf die Byte-Postition kommen, durch RandomAccessFile testen

> werde testen aber wie ist das wenn man die einzelne Zeichen nicht als TEXT bzw String bekmmt sondern als Folge von Hexzahlen ??

das macht es schwieriger, die zweite Variante meines letzten Postings könnte weitgehend die RandomAccessFile-Möglichkeiten nachbauen,
nur ohne Herumspringen, du willst ja eh sequentiell durchlaufen, dafür mit Cache, also schneller,
 
vielen Dank für die Antwort und erklären wenn du noch Beispiele kennst wird mir noch mehr helfen.
habe nicht gedacht das so komplex wird, ging davon aus, dass RandomAccessFile soll die Aufgabe ganaoso wie alle I/O Klassen erledigen leider ist das nicht der Fall.

ich bedanke mich ganz herzlich.

Grüße,

Ottens
 

Neue Themen


Zurück
Oben