Zeile an Anfang einer Datei einfügen

00d4vid

Mitglied
Hallo,

ich bin nun schon etwas länger am suchen und wollte hier nochmal nachfragen, ob es eine Möglichkeit gibt, am Anfang einer Datei eine Zeile einzufügen, ohne, dass der bisherige Inhalt überschrieben wird.
Möglich ist natürlich, die ganze Datei auszulesen, am Anfang einen String hinzuzufügen und dann die Datei neu zu schreiben, nur habe ich bis zu 1000 Threads die gleichzeitig schreiben und da wird das nicht allzu performant sein befürchte ich.

Gibts da in Java was?
 
Hi
Die Windows API liefert das (meines Wissens) nicht - Somit Java auch nicht. Es kann also nur an eine Datei etwas angehängt werden.
 
Oh Danke für die Korektur :)

Ich habe mich sogar noch gefragt ob ich das so schreiben soll. Das mit der Windows API habe ich mal ihrgendwo gelernt (Hoffe das ich das richtig gelernt hab/noch aktuell ist) und habs dann einfach auf Java portiert, da diese ja auch wieder auf die API zugreifft.

Weisst du wie die RandomAccessFile intern arbeitet?


Gruss
 
Aber beim RandomAccessFile verändert er aber doch nicht die länge der Datei oder?
Wenn ich da in Zeile 1 eine neue Zeile einfüge dann ist die alte Zeile 1 doch gelöscht oder kann ich die einfach nach unten schieben?
Weil wenn das nicht geht müsste ich ja, um alle Daten zu behalten, wieder die Datei erst einlesen, den String anfügen und die Datei wieder schreiben oder?
 
Instances of this class support both reading and writing to a random access file. A random access file behaves like a large array of bytes stored in the file system. There is a kind of cursor, or index into the implied array, called the file pointer; input operations read bytes starting at the file pointer and advance the file pointer past the bytes read. If the random access file is created in read/write mode, then output operations are also available; output operations write bytes starting at the file pointer and advance the file pointer past the bytes written. Output operations that write past the current end of the implied array cause the array to be extended. The file pointer can be read by the getFilePointer method and set by the seek method.

Hört sich für mich an, als würde intern mit einer Collection gearbeitet und die Datei so oder so eingelesen.

Also kannst du, wenn du eine Zeile nur an den Anfang setzen willst, gleich die alte Datei einlesen und eine neue erstellen (auf Basis einer temporären Datei).
 
Aber beim RandomAccessFile verändert er aber doch nicht die länge der Datei oder?
Wenn ich da in Zeile 1 eine neue Zeile einfüge dann ist die alte Zeile 1 doch gelöscht oder kann ich die einfach nach unten schieben?

Hallo,

nein, es werden logischerweise neue Zeichen hinzugefügt!
Siehe auch das Zitat von Hamment:
A random access file behaves like a large array of bytes stored in the file system.
So etwas wie "Zeilenweise" gibt es hier á prioiri erstmal nicht!

Lies Dir meinen Link von oben durch resp. diese Referenz:
http://www.dpunkt.de/java/Referenz/Das_Paket_java.io/63.html

Die Verwendung sollte dann etwa so laufen:
Code:
RandomAccessFile rafOutPut = null;
                         
int iLaenge = strRes.length();
byte[] Buffer = new byte[256];
                             
for( int k = 0; k < iLaenge; k++ )
{
    Buffer[k] = (byte)strRes.charAt( k );
}

try
{
    rafOutPut = new RandomAccessFile( "Meine_tolle_Datei.txt" , "rw" );
     rafOutPut.seek( rafOutPut.length() );
     rafOutPut.write( Buffer, 0, iLaenge);
    // void java.io.RandomAccessFile.write(byte[] b, int off, int len)
    // Writes len bytes from the specified byte array starting at offset off to this file. 
    // Parameter:
    // b the data.
    // off the start offset in the data.
    // len the number of bytes to write.
    // Löst aus:
    // IOException if an I/O error occurs.
}

Gruß
Klaus
 
Ich probiers mal aus. Danke.
Wenn das so geht wie vfl_freak geschrieben hat dann ist es super, wenn nicht dann bleibt mir wohl nix anderes übrig zu testen, ob es bei meinem Tool performant läuft wenn ich das mit Datei einlesen - String vorne anfügen - Datei neu schreiben mache.
 
Hallo deepthroat

ich glaube, wir haben beide irgendwie Recht ;)

Ich finde die Stelle zwar in meinen Sourcen derzeit nicht, aber diesen Ausschnitt aus dem schönen Buch "Java ist auch eine Insel" :
13.2.4 Die Länge des RandomAccessFile

Mit zwei Methoden greifen wir auf die Länge der Datei zu: einmal schreibend verändernd und einmal lesend.

* long length() throws IOException Liefert die Länge der Datei. Schreibzugriffe erhöhen den Wert, und setLength() modifiziert ebenfalls die Länge.
* void setLength( long newLength ) throws IOException Setzt die Größe der Datei auf newLength. Ist die Datei kleiner als newLength, wird sie mit unbestimmten Daten vergrößert; wenn die Datei größer war als die zu setzende Länge, wird die Datei abgeschnitten. Dies bedeutet, dass der Dateiinhalt mit setLength(0) leicht zu löschen ist.

Man muss wohl erst die aktuelle Länge auslesen und dann mit "setLength( alt + neu)" richtig setzen.

Dann sollte alles wie gewünscht funktionieren .... :p

Gruß
Klaus
 

Neue Beiträge

Zurück