Schnelles lesen oder schreiben in Datei

!-Void-!

Newbie
Registriert
März 2008
Beiträge
5
Hallo @ all... mein erster Beitrag! :D

kl. Vorgeschichte
Hab mit Java ein kleines Grafisches Tool gebaut. (PingIt)
Das Tool pingt nach verschiedenen Hosts und zeigt die erreichbarkeit Grafisch an.
Jeder Ping wird in einer log.txt gespeichert. Diese log wird wieder in einem Fester ausgegeben.

Nun zu meinem Problem:
Ich schriebe eine xxx.txt die immer größer wird.
Neue Zeilen kann ich an die Datei nur Anhängen.
Frage: Kann ich die Zeile nicht an die erste Position schrieben ohne das ich erst alle
Zeilen einlesen muss????


Auslesen kann ich einen Datei nur von oben nach unten...
Frage:Geht es wirklich nicht anders???


Ich will nur die letzten 200 Zeilen anzeigen lassen!
Momentan löse ich das Problem so: ---> Ist bei großen Datein aber viel zu langsam...

In einem Thread schreibe ich immer wieder in eine LogDatei
Ein anderer Thread liest nun diese Datei

// Alle Zeilen aus der Datei lesen
while ( (zeile=br.readLine()) != null ) {
zeilen=zeilen+zeile+"&&&";
i++;
}


//letzte 200 Zeilen in einen neuen Sting packen
String [] logZeilen = zeilen.split("&&&"); // Hab bei Java 1.4 keine List :(
String logText = "";
for (int j=logZeilen.length-1; j > logZeilen.length-200; j--) {
logText=logText + logZeilen[j] +"\n";
}

//Ausgabe
esf.jEditorPane2.setText(logText);

Also so geht es mehr schlecht als recht...
Ich brauche eine !!schnelle!! Möglichkeit um entweder neue Zeilen an den Anfang einer Datei zu schreiben oder eine bei der ich die letzten 200 Zeilen einer Datei auslesen kann.

Hab schon selber im Internet und in meinen Büchern gesucht aber leider nichts gefunden was mir weiter helfen konnte.
 
Guten Morgen,

Du verwendest also JAVA 1.4! Gut.

1) Warum liest Du die Daten zeilenweise aus der Datei und packst sie dann in einen riesigen String? Am besten gleich in ein Array schreiben. Dann sparst du auf alle Fälle langsame String-Operationen.

2) String ist, zumindest noch bei JAVA 1.4, ziemlich langsam. Nimm lieber StringBuffer. Ist wesentlich schneller in der Verarbeitung. Hab damit ziemlich gute Erfahrungen gemacht.

3) Um die Sache wirklich zu beschleunigen, kannst Du ja die Daten falsch umsortieren. Du hast alle Zeilen da.
Schritt 1: Sortiere alle Zeilen von hinten nach vorne in ein neues Array.
Schritt 2: Schreibe diese in eine Datei.
Schritt 3: Beim Auslesen (Anzeigen) nur die ersten 200 Zeilen auslesen.
Schritt 4: Wenn du schreibst, erst die Zeilen in das Array schreiben, die neu sind, dann den schon bestehenden Teil anhängen.

Gruß
Tom
 
Achso, was ich noch vergessen hatte:

Wieso gibt es in Java 1.4 keine List?

java.util.List

Gruß
Tom
 
Ich finde deine Lösung generell sehr umständlich. Meines Erachtens ist es besser, die Datei nicht auszulesen, um sie anzuzeigen.
Du generierst mit jedem Ping einen String, oder?
Ist es da nicht einfacher, diesen per an die Datei anzuhängen und gleichzeitig im Logfenster anzuzeigen? Wozu in Datei schreiben und dann wieder auslesen?
 
Code:
[COLOR="SeaGreen"]// Alle Zeilen aus der Datei lesen [/COLOR]
while ( (zeile=br.readLine()) != null ) {
    zeilen=zeilen+zeile+"&&&";
    i++;
}


[COLOR="SeaGreen"]//letzte 200 Zeilen in einen neuen Sting packen[/COLOR]
String [] logZeilen = zeilen.split("&&&"); [COLOR="SeaGreen"]// Hab bei Java 1.4 keine List [/COLOR]
String logText = "";
for (int j=logZeilen.length-1; j > logZeilen.length-200; j--) {
    logText=logText + logZeilen[j] +"\n";
}

[COLOR="SeaGreen"]//Ausgabe[/COLOR]
esf.jEditorPane2.setText(logText);

Unabhängig von einer schnellen Lösung ersteinmal eine generelle Frage:
Warum ließt du die Datei erst aus, baust die Datei dann wieder neu zusammen, diesmal mit einem anderen Trennzeichen, und trennst sie im Anschluß wieder um sie dann noch einmal neu zusammen zu bauen? :daumen:

Unabhängig davon, dass es sinnvoller wäre die neuesten Einträge an den Anfang der Datei zu schreiben (was ja bereits vorgeschlagen wurde). Dein Vorgehen zum "String-Bauen" ist in Java ein absolutes NOGO, wenn nicht gerade der Compiler das gerade biegen kann hast du hier ein riesiges Problem, von daher mach doch zumindest folgendes:
Datei auslesen und die letzten 200 Zeilen speichern. Das könnte dann z.B. so in etwa aussehen:
Code:
String[] lineBuffer = new String[200];
int nextIndex = 0;

[COLOR="SeaGreen"]// Alle Zeilen aus der Datei lesen [/COLOR]
while ( (zeile=br.readLine()) != null ) {
    lineBuffer[nextIndex] = zeile;

    nextIndex++;
    nextIndex %= lineBuffer.length;
}

[COLOR="SeaGreen"]// Die letzten 200 Zeilen zusammenbasteln[/COLOR]
StringBuffer outputBuffer = new StringBuffer();
for( int i=0; i < lineBuffer.length; i++ ) {

    if( lineBuffer[nextIndex] == null) break;

    outputBuffer.append( lineBuffer[nextIndex] );
    outputBuffer.append( "\n" );

    nextIndex++;
    nextIndex %= lineBuffer.length;
}

[COLOR="SeaGreen"]//Ausgabe[/COLOR]
esf.jEditorPane2.setText(outputBuffer.toString());

Von diesem Vorgehen würde ich aber auch abraten! Weitaus sinnvoller ist es mal das Konzept zu überdenken, warum schreibst du das Ergebnis erst in eine Datei um diese anschließend gleich wieder auszulesen? Auch über die Ausgabe in einem "TextFeld" kann man sich streiten - der Rest wurde ja schon gesagt (auch was die Listen betrifft) ;-)
 
Die Logdatei kann ja auch kleiner 200 Zeilen sein... deswegen kann ich am Anfang noch nicht sagen wie groß die Anzahl der Felder sein muss...

Das mit der Liste hab ich schon versucht.

mom... ich teste nochmal...
Mein Fehler...
List<String> zeil = new ArrayList<String>(); :(
ArrayList<String> zeil = new ArrayList<String>(); :)

Ok... so wird es schon schneller

------------------------------------------------------------------------------------
// Max Anzahl der Zeilen ermitteln
while ( (zeile=br.readLine()) != null ) {
i++;
}
br.close();
br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

ArrayList<String> zeil = new ArrayList<String>();
// Jetzt max. 200 Zeilen in eine Liste aufnehmen
while ( (zeile=br.readLine()) != null ) {
i--;
if (i < 200) {
zeil.add(zeile);
}
}
// Liste in einen String wandeln und im Editor ausgeben...
....
---------------------------------------------------------------------------------------


Danke

@XWing: Wenn ich es so mache dann hab ich evtl. in einer Sekunde 12 mal eine neue Zeile in dem JEditor...
1. Hab ich dann ein nervendes Flakern
2. Bekomme ich dann ein nervendes "Büüüp" von Windows

Die Datei lese ich erst nach 1,5Sek. aus egal ob 0-100 neue Zeilen geschrieben
wurden.

@All: Ok... ich würde ja ganz gerne neue Zeilen am Anfang der Datei einhängen.
Ist es dann aber nicht so dass ich beim schreiben die ganze Datei
zwischenspeichern muss? Ich schreibe evtl. 100 mal öfter als ich lese...
 
Mit der Liste und dem "nicht alles" in einen String schreiben geht es jetzt auch mit 100000 Zeilen super schnell!

Danke @ all!!!!
 
Zurück
Oben