# Datei zeilenweise rückwärts lesen



## heidiweber (27. Apr 2009)

Hallo,

ich muss in einer sequentiellen Datei hin- und herspringen. Daher habe ich folgende Methode geschrieben:


```
/**
     * 
     * Liest den vorherigen Datensatz
     * 
     * @param position
     * @return
     * @throws java.lang.Exception
     */
    private String readPreviousLine(long position) throws Exception {

        StringBuilder cache = new StringBuilder();
        char c;
        if (position != 0) {

            this.posEnde = position;

            position = position - 3;

            raFile.seek(position);

            //Verarbeitung fuer Dateien mit variabler Datensatzlaenge
            while (true) {
                c = (char) raFile.read();
                if (c == '\n' || position <= 0 || c == '\uFFFF') {
                    break;
                }
                cache.append(c);
                position--;
                raFile.seek(position);
            }

            if (position > 0) {
                this.posStart = position + 1;
            } else if (position == 0) {
                cache.append(c);
                this.posStart = position;
            }
        }

        return cache.toString();
    }
```

Was meint ihr? Kann man an dieser Methode noch was verbessern/optimieren? Die Methode funktioniert. Nur ich finde ein bisschen langsam. Das kommt meiner Meinung daher, dass ich ja immer eine Stelle zurück muss (raFile.seek(position).

Vielen Dank für die Hilfe
Grüße
Heidi


----------



## SlaterB (27. Apr 2009)

lies vorwärts ein und verwende dann StringBuilder.reverse oder drehe manuell im Speicher um?
das dauert doch keine Zeit, aber das Einlesen geht dann deutlich schneller, 
vielleicht sogar mit anderen Methoden, gleich ein ganzes Array einlesen oder so


----------



## heidiweber (27. Apr 2009)

naja - so einfach geht das dann doch leider nicht.

Die Dateien können mehrere Millionen Datensätze haben. Und wenn ich z.B. den 5687453 Datensatz gelesen habe, möchte ich den vorherigen haben. Und da wieder von vorne zum Lesen anfangen....

Aber trotzdem vielen Dank für den Tipp.


----------



## SlaterB (27. Apr 2009)

wie lang ist so ein Datensatz durchschnittlich?

die Position hast du ja, dann geh von dort aus statt um 1 gleich um 1000 Schritte zurück, 
lies 1000 Zeichen auf einmal in ein Array und schau dir dort vom letzen Index an rückwärts, ob '\n' oder '\uFFFF' enthalten ist,
Rest verwerfen oder gegebenenfalls weitere 1000 Zeichen lesen,
so kannst du auch gleich rückwärts einfügen


----------



## heidiweber (27. Apr 2009)

Die Dateien sind in der Regel variabel. Sonst wäre es ja nicht so schwer.

Der Tipp mit den 1000 Zeichen ist nicht schlecht (hätte ich auch selbst darauf können können). Werde das einbauen und schauen, obs schneller wird - denke doch mal.

Vielen Dank
Grüße
Heidi


----------



## Ark (27. Apr 2009)

Man könnte auch kurzerhand einen Index aufbauen, der die Positionen der Zeilenanfänge aufnimmt, und sich anschließend via RandomAcessFile rückwärts hangeln.

Ark


----------



## heidiweber (28. Apr 2009)

Habe ich mir auch schon gedacht - nur können die Dateien evtl. auch 100 Mio. und mehr Datensätze haben und dafür ein Array....???

Vielen Dank euch allen für die Tipps - "werde das mit den 1000 Stellen rückwärtsspringen" austesten...

Grüße
Heidi


----------



## SlaterB (28. Apr 2009)

der Index kann ja auch wieder in einer Datei liegen, wie findest du innerhalb von 100 Mio. Daten überhaupt was?
kennst du das Konzept einer Datenbank?


----------



## thE_29 (28. Apr 2009)

Sowas hier?
http://www.java-forum.org/blogs/the...r-datei-rueckwaerts-zeilenweise-auslesen.html


----------



## heidiweber (28. Apr 2009)

das ist eine Datei, die von einem IBM-Großrechner kommt. Kann ich (leider) nicht ändern. Ich möchte den Datensatz ja nur anzeigen.

Vielen Dank auch an thE_29


----------

