# Einlesen einer Textdatei



## Paladin (4. Sep 2005)

Hi,

ich schreibe gerade ein Programm bei dem unter anderem eine oder mehrere Textdateien mit 200000 Zeilen und mehr eingelesen werden soll. Das Programm sortiert die relevanten Daten aus der Textdatei in 5 verschiedenen Hashtables.
Später sollen die Daten aus den Hashtables dann in eine Datenbank geschrieben werden.

Mein Problem dabei ist, dass das einlesen der Textdatei viel zu lange dauert. Allein bei einer Textdatei mit 30000 Zeilen braucht mein Programm ca. 30 Sekunden. Ich durchlaufe alle Zeilen in der Datei mit einer for Schleife die etwa so aufgebaut ist:


```
int dateilaenge = file.length();
int i = 0;
String aktuelleZeile;
BufferedReader in = new BufferedReader(new FileReader(file));

for(i=0;i<dateilaenge;i++) {
   aktuelleZeile = in.readLine();
   //hier kommt der ganze restliche Sortier-Code
}
```

Kann man an diesem Statement vielleicht noch etwas tun um die Performance spürbar zu verbessern?
Gibt es vielleicht eine andere Möglichkeit als BufferedReader(FileReader) die für diese Operation besser geeignet ist?

Vielen Dank im voraus

Gruß

Paladin


----------



## 8ull23y3 (4. Sep 2005)

Der BufferedReader is schon der schnellere. Aber bei 30000 Zeilen? Ist das so ein großes wunder?


----------



## 8ull23y3 (4. Sep 2005)

Aber du kannste das mal probieren:


```
BufferedReader br = new BufferedReader(new FileReader("wasweissich.txt"));
String tmp;
while((tmp = br.readLine) != null)
{
  // mach was
}
```

wenn ich mich richtig erinnere


----------



## Paladin (4. Sep 2005)

Hi 8ull23y3,

das ist echt unglaublich. Das ersetzen der For Schleife durch eine While Schleife hat die Programmlaufzeit
bei 30000 Zeilen von 30 Sekunden auf 1(!) Sekunde verkürzt. Ich hätte nie gedacht, dass der Performanceunterschied zwischen den beiden Schleifen so extrem ist. Vielen Dank für diesen genialen Tipp.  :applaus: 

Gruß

Paladin


----------



## Beni (4. Sep 2005)

Es liegt weniger an der Schleife, sondern mehr an der Schleifenbedingung...

Deine Schleife wurde für jedes Zeichen durchlaufen, bullzeyes hingegen nur für jede Zeile.


----------



## Bleiglanz (4. Sep 2005)

> for(i=0;i<dateilaenge;i++) {
> aktuelleZeile = in.readLine();
> //hier kommt der ganze restliche Sortier-Code
> }


warum das überhaupt funktioniert hat?

seltsam...


----------



## Paladin (4. Sep 2005)

Warum sollte es nicht funktionieren?


----------



## Roar (4. Sep 2005)

@Bleiglanz: es funktioniert, da readLine() ja netterweise null zurückliefert wenn nix mehr da ist, anstatt ne EOFException zu werfen o.Ä.

@Paladin: weil wahrscheilnich 90% der schleifedurchläufe bei dir versuchen was zu lesen, obwohl die datei schon längst fertig eingelesen wurde. darum dauert deine methode auch so lang.


----------



## milanwb (20. Sep 2005)

Hallo,

habe das selbe Problem bei meinem Programm, nur dass es ein signiertest Applet ist und dann der Browser abschmiert. Kleinere Textdateien funktionieren. Es muss aber ein Applet sein, weil ich sonst nicht auf die Mysqldatenbank zugeifen kann.
Das Programm an sich gleicht Daten der Textdatei auf meiner Festplatte mit den meiner Mysqldatenbank ab.
Nur diese Datei ist nun mal 20 mb groß (eine Preisliste von nem Onlineshop).

Ich schreibe mal hier einen Teilcode rein. Vll kann man den irgendwie verbessern oder muss man eine andere Methode bei Applets verwenden?


```
// Hinweis
// die Variabel dateiname ist ein String der an diese Methode übergeben wird


BufferedReader in = new BufferedReader(new FileReader(this.dateiname)); 
String tmp = null;


while ( (tmp = in.readLine()) != null) {

//gleiche dateien ab...

}
```


----------

