java - zeile an dateianfang anhängen

tmp

Ensign
Registriert
Feb. 2004
Beiträge
253
hallo!

und zwar möchte ich ein paar statistiken einer datei auslesen und diese dann an die erste zeile der datei anhängen.
ich habe mir eine methode geschrieben,welche zwar funktioniert aber noch komische zeichen am dateianfang hinzufügt.

Code:
	public static void writeFirstLine(String fileName,String text){ 
	    RandomAccessFile output = null; 
	    try 
	    { 
	      output = new RandomAccessFile( fileName, "rw" ); 
	      output.writeUTF(text);
	    } 
	    catch ( IOException e ) { 
	      e.printStackTrace(); 
	    } 
	    finally {

	      if ( output != null ) 
	        try { output.close(); } catch ( IOException e ) { e.printStackTrace(); } 
	    } 
	}

rufe ich die methode mit einem string "abc" auf,wird erst ein umbruch und dann die zeichenkette angefügt. wieso ist das so?
habt ihr vlt eine bessere lösung?
 
Wenn du am Anfang einer Datei etwas einfügen möchtest, solltest du folgendermaßen vorgehen:

1. Benutze einen FileReader/Writer (am besten in einem BufferedReader/Writer) statt RandomAccesFile
2. Lese zunächst den Inhalt der Datei mit einem FileReader ein
3. Platziere die hinzukommenden Daten am Anfang des eingelesenen String
4. Schreibe die Datei mit einem FileWriter neu auf die Platte

Das Problem beim RandomAccesFile und einem Schreibvorgang ist, daß er nicht einfügt, sondern bereits vorhandenen Inhalt überschreibt. Du musst also die Datei vorher komplett einlesen. Dazu sind FileReader und BufferedReader am besten.
 
ja danke für die antwort -> problem ist nur,dass ich hier von 2gb dateien rede
d.h. ich will wirklich nur eine zeile an den anfang schreiben und nicht den kompletten inhalt wieder durch nen string jagen.
 
Unterstützt Windows das überhaupt? Ich denke Windows erlaubt nur das Anhängen an das Ende einer Datei.
 
was hat das mit windows zu tun?!
 
Hat garnichts mit Windows oder dem Betriebssystem zu tun
 
eben.

hat denn jmd noch eine andere idee?
 
Wenn die Daten wirklich am Anfang sein müssen, gibt es keine andere Alternative. In dem Fall musst du tatsächlich die ganzen Daten zuerst einlesen.


wofür ist es denn gedacht? Vielleicht kannst du euch einfach die Daten ans Ende hängen. Dann sparst du das Einlesen.
 
Wieso hat das nichts mit dem BS zu tun? Auch wenn du in Java und ähnlichem programmierst, so wird am Ende ja doch wieder die Windows-API verwendet, um Dateien zu lesen oder zu schreiben. Und so unverständlich das Ganze für manche klingen mag, unterstützt Windows meines Wissens nur das Anhängen an Dateien.

Wieso müssen denn die Daten am Anfang stehen? Normalerweise löst man soche Probleme dann durch einen Dateiaufbau, ungefähr so:
PHP:
Chunksize      "9"                   // Definiert die Größe des folgenden Blocks
Chunkdata      "testblock"           // Daten des Blocks
Chunksize      "18"                  // Nach den Daten folgt wieder die Größe des nächsten Blocks
Chunkdata      "noch ein testblock"  // Und die Daten des nächsten Blocks
.
.
.
 
Zuletzt bearbeitet:
die dateien müssen am anfang stehen,weil ich standartisierte dateien generieren will.
und der standard besagt leider,dass alle statistiken an erster stelle stehen.
 
Simpson474 schrieb:
Wieso hat das nichts mit dem BS zu tun? Auch wenn du in Java und ähnlichem programmierst, so wird am Ende ja doch wieder die Windows-API verwendet, um Dateien zu lesen oder zu schreiben. Und so unverständlich das Ganze für manche klingen mag, unterstützt Windows meines Wissens nur das Anhängen an Dateien.
Richtig, Java nutzt die Windows-API wenn es unter Windows läuft, aber was ist, wenn es unter Linux läuft? Es darf für ein Java-Programm doch keinen Unterschied machen, insofern interessiert es gar nicht, ob es eine Windows-Einschränkung ist, oder nicht.

Und man sollte mal darüber nachdenken, wie Dateien gespeichert sind... unabhängig davon, ob sie nun in Zuordnungseinheiten aus mehreren Sektoren bestehen oder nicht, die Festplatte organisiert alles in Sektoren (momentan ja noch 512 Bytes). Was passiert also, wenn man auch nur ein Byte an den Anfang, oder die Mitte "hängt" (hängen ist da sowieso das falsche Wort, es muss einfügen heißen)... alles verschiebt sich, es jeder einzelene Sektor muss neu geschrieben werden, was bei einer 2 GB-Datei halt nicht unbedingt ideal ist...

Und wie man das Problem präventiv löst ist egal, man muss vom worst case ausgehen, dass man Dateien nachträglich ändert...

Gut, die Lösung wäre meiner Meinung nach:
a) Neue Temporärdatei in selben Ordner erstellen
b) Den hinzuzufügenden Text in diese Datei schreiben
c) Die alte Datei blockweise (Blockgröße kannst du im Prinzip selbst bestimmen) auslesen und diese Blöcke immer direkt in die Temporärdatei schreiben
d) Alte Datei schließen, neue Datei schließen
e) Insofern kein Fehler auftrat alte Datei löschen und Temporärdatei umbenennen

Edit: Es empfiehlt sich zum Testen die Blockgröße relativ klein zu wählen, und es mit kleinen Testdateien (die allerdings noch größer als die Blockgröße sind, und wenn es geht deren Dateigröße auch kein genaues Vielfaches der Blockgröße ist) auszuprobieren.
 
Zuletzt bearbeitet:

Ähnliche Themen

Antworten
8
Aufrufe
3.672
Zurück
Oben