# FileWriter || BufferedWriter



## yidaki (14. Oktober 2004)

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


----------



## soa (14. Oktober 2004)

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


----------



## yidaki (14. Oktober 2004)

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?


----------



## Thomas Darimont (14. Oktober 2004)

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:

```
/*
 * 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


----------



## yidaki (14. Oktober 2004)

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...


----------



## Thomas Darimont (14. Oktober 2004)

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


----------



## yidaki (14. Oktober 2004)

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ß


----------



## schnuffie (15. Oktober 2004)

...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:


```
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


----------



## yidaki (18. Oktober 2004)

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:
> ...



also ich hab ne temporäre File Datei erstelle


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

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


```
if (file.exists()){ 
   fileSource.delete();
}
```
löschen. Wie kann ich jetzt noch das Temp File in das Verzeichnis fileSource.getAbsolutPath speicher? 
gruß


----------



## yidaki (19. Oktober 2004)

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


----------



## schnuffie (29. Oktober 2004)

_Ja, manchmal dauern längere Sachen länger als kürzere..._


----------

