FileWriter || BufferedWriter

yidaki

Erfahrenes Mitglied
Hi zusammen.
ich möchte eine Datei bis zu einer bestimmten zeile einlesen und dort code einfügen....

ist es möglich mit einem der beiden (fw, bw) text innerhalb einer Datei einzufürgen zu ändern oder zu löschen? Wenn nicht gibt es dann eine andere Möglichkeit ausser die ganze Datei zeile für zeile neu zu schreiben..

mfg
 
Hallo,

Die Klasse RandomAccessFile ermöglicht es mit Hilfe ihrer Methode,
seek(long n);
einen Zeiger in einer Datei zu positionieren .

So kannst du an einer bliebigen Stelle in der mit dem Lese-oder Schreibvorgang
der datei beginnen.

Ich hoffe, dass dir das so weiterhilft:-)

SOA
 
An einer beliebigen stelle, heisst zeile 1 -- n-1 oder z.b. auch wenn ich in der zeile bin, die mit dem text System.out.println("Hallo Welt"); anfängt?
 
Hallo!

So kannst du an einer bliebigen Stelle in der mit dem Lese-oder Schreibvorgang
der datei beginnen.
Jedoch überschreibst du dabei wohlmöglich Daten ... die Datei wird nämlich nicht automatisch vergrößert! Es werden eben nur schon vorhandene Zeichen überschrieben.
Wenn du in einer Datei bestimmte Werte ändern willst bleibt dir wohl nichts anderes übrig als:
1) Kopiere die Daten vor dem Einfügepunkt in eine neue Datei.
2) Schreibe die neu einzufügenden Daten in die neue Datei.
3) Kopiere die Daten nach dem Einfügepunkt in die neue Datei.
4) Lösche die alte Datei und benenne die Neue Datei in die alte Datei um.

Falls die zu ändernden Daten jedoch IMMER die gleiche Länge haben könntest du mal folgendes Ausprobieren:
Code:
/*
 * Created on 14.10.2004
 */
package de.tutorials;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @author Darimont
 *  
 */
public class Test11 {

    public static void main(String[] args) {
        try {
            RandomAccessFile raf = new RandomAccessFile(
                    new File("c:/Test.fil"), "rw");

            String[] items = { "abc=123\n", "def=456\n", "ghi=789\n" };
            long[] pos = new long[items.length];

            for (int i = 0; i < pos.length; i++) {
                pos[i] = raf.getFilePointer();
                raf.writeBytes(items[i]);
            }
            
            //...
            
            

            raf.seek(pos[1]+"def=".length());//Wir stehen nun vor "456\n"
            //Wir wollen 456 in 999 ändern.
            raf.writeBytes("999");
            raf.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Gruß Tom

Gruß Tom
 
Das heisst, wenn ich die Datei einfach erweitern würde, währe ein stück der datei hinten abgeschnitten, da sich die grösse der bytes nicht dynamisch verändert....

ich werd´s dann einfach in eine neue datei reinschreiben...

thx...
 
Exakt...!

Ein weiterer wenn auch etwas fummeliger Ansatz wäre hinter jeder Zeile in der Datei genügend Platz (als Puffer) zu lassen, dass nachfolgende Daten nicht bei einer Datensatzänderung beeiträchtigt werden.

Gruß Tom
 
Naja, es geht um eine codegenerierung.... das währe denke ich wirklich zu viel arbeit... naja werd dann wohl die datei in 3 teile zerstückeln... das hört sich sehr gut an
;-)
gruß
 
Zuletzt bearbeitet:
...damit ich auch noch meinen Senf beigebe ;) :

Würde warscheinlich eher in einen StringBuffer die Datei vollständig lesen, dann in aller Ruhe meine Anpassungen sehr performat im Speicher erledigen und zum Schluß den StringBuffer wieder in die Datei schreiben:

Code:
PrintWriter pw = new PrintWriter(new FileWriter("c:\\uhu.txt"));
pw.println(sbStringBuffer.toString()); //StringBuffer ausgeben
pw.close();

Macht die Sache doch rund, oder? :)

CH schnuffie
 
Thomas Darimont hat gesagt.:
Hallo!

Jedoch überschreibst du dabei wohlmöglich Daten ... die Datei wird nämlich nicht automatisch vergrößert! Es werden eben nur schon vorhandene Zeichen überschrieben.
Wenn du in einer Datei bestimmte Werte ändern willst bleibt dir wohl nichts anderes übrig als:
1) Kopiere die Daten vor dem Einfügepunkt in eine neue Datei.
2) Schreibe die neu einzufügenden Daten in die neue Datei.
3) Kopiere die Daten nach dem Einfügepunkt in die neue Datei.
4) Lösche die alte Datei und benenne die Neue Datei in die alte Datei um.

also ich hab ne temporäre File Datei erstelle

Code:
File file = new File("c:/temp/test.java");

Die Datei ist fix und fertig. Die Andere Datei kann ich warhscheinlich mit

Code:
if (file.exists()){ 
   fileSource.delete();
}
löschen. Wie kann ich jetzt noch das Temp File in das Verzeichnis fileSource.getAbsolutPath speicher?
gruß
 
ok, die frage war wohl entweder zu einfach oder nicht verständlich... wie auch immer es geht mit

file.renameTo(fileSource);

... hat länger gedauert wie den rest des programms zu schreiben ;-)...

ok merci
 
Zurück