Wert aus Datei lesen,um eins hochzählen und durch die neue Zahl ersetzen

armina

Grünschnabel
Hallo Leute,

ich möchte in einer Datei eine bestimmte Stelle, die eine Ziffer enthält um eins hochzählen und zurückschreiben.
Dazu habe ich Folgendes gemacht:
Code:
BufferedReader br = new BufferedReader(new FileReader(dta)); 
                BufferedWriter bw =  new BufferedWriter(new FileWriter(dta)); 
                RandomAccessFile raf = new RandomAccessFile(dta, "rw"); 
                String sb = br.toString().substring(3, 4); 
                int i = Integer.parseInt(sb) + 1; 
                raf.seek(3); 
                bw.write(i);
Es funktioniert leider nicht. Die Datei ist nach dem Durchlauf leer.
Kann mir bitte jemand helfen ?
 

sheel

I love Asm
Hi

a) Wieso verwendest du BufferedReader/Writer und RandomAccessfile?
Eins der zwei würde reichen, und die RAFile ist aus später genannten Gründen ungeeignet.
Außerdem kann nur ein Schreibzugriff pro Datei gleichzeitig existieren
(mehrmals Lesen ist möglich). Der BufWriter und die RAFile stören sich gegenseitig.

b) Ein Seek mit der RAFile und ein Write über den BufferedWriter?
Die arbeiten nicht zusammen.

c) Ein generelles Problem mit Dateien:
Man kann zwar Bytes in der Mitte überschreiben, aber man kann nichts in der Mitte einfügen,
das eine andere Länge als der vorhandene Teil hat.
Wenn das Neue zu kurz ist bleibt ein Teil vom Alten übrig.
Den kann man auch mit neuem Inhalt überschreiben, aber nicht einfach rausschneiden.
Und wenn das Neue zu lang ist wird mehr als gewünscht überschrieben.

Wenn die Zahl 99 ist und nach der Erhöhung 100 ->von 2 zu 3 Stellen
hat man auf die Überschreib-Art ein Problem.
Deshalb kann man die RAFile vergessen.
Zuerst alles (mit BufReader) auslesen und mit ersetztem Wert neu schreiben.

d) toString von einem BufReader gibt nicht den Dateiinhalt zurück.
Eher eine Info, dass es sich um einen BufferedReader handelt.

e) Dateien close´n und Exceptions abfangen schadet bei dem Code nicht.

Gruß
 

armina

Grünschnabel
Danke für die Antwort sheel. Doch wie sage ich dann dem BufferedReader bzw. Writer an welcher Stelle etwas gelesen und überschrieben werden soll?
RandomAccessFile habe ich deswegen hergenommen, um mit .seek die Position zu bestimmen.
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

wie sheel schon schrieb:
Zuerst alles (mit BufReader) auslesen und mit ersetztem Wert neu schreiben.
Du kannst damit nur ALLES auslesen und schreiben - sprich: Du musst den gesamten Buffer auslesen, dann nach Deinen Wünschen anpassen und komplett wieder schreiben!

Gruß
Klaus
 

sheel

I love Asm
Genau.
Mit der RandomAccessFile kann man zwar seek´en,
aber trotzdem nichts aus der Dateimitte ausschneiden/einfügen,
wenn das Neue eine andere Länge hat.

Und bei menschenlesbaren erhöhten Zahlen kann das schon vorkommen.
Nicht bei 12->13, aber zB. 99->100
...
 

sheel

I love Asm
Das geht so nicht.
Es bringt dir nichts zu einer bestimmten Position zu springen,
weil das Schreiben dort Probleme machen wird.
Vorausgesetzt, die Datei ist nicht zu riesig:

Du musst die gesamte Datei einlesen, im Programm ändern,
und wieder alles rausschreiben.
 

armina

Grünschnabel
Ich glaube ich gebs auf :)
Das Lesen und Zurückschreiben ist mir klar. Doch verstehe ich eins nicht. Ich muss nur ein Zeichen verändern und den Rest so belassen. Wie geht das anders, als die Position zu bestimmen?
Angenommen in der dat.txt steht Folgendes:
13444 23415356 aDhjs 31744
wie sage ich, dass die 7 verändert werden soll, ohne zu wissen, wieviele 7 es gibt.
Es würde mich auch interessieren zu wissen, wie es funktioniert, wenn das Neue die gleiche Länge hat.
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

um bei Deinem Beispiel zu bleiben :
(a) Deinen Inhalt in einen String schrieben,
(b) dann REPLACE '7' mit 'WasAuchImmer'
(c) den geänderten String schreiben

Wenn die 7 mehrfach vorkäme, musst Du halt schauen, WELCHE ersetzt werden soll ....

Gruß
Klaus
 

sheel

I love Asm
Zum Position-bestimmen:
Bei der Alles-einlesen-Methde hat die Stringklasse unter Anderem ein indexOf,
damit kann man nach Teilen drin suchen und bekommt die Position.

Für den Gleiche-Länge-Fall, mit RandomAccessFile oÄ.: Einlesen, Einlesen.
bis man zu einer 7 kommt.
Dann kann man etwas zurückseeken, damit man genau vor der 7 ist,
und dort dann einfach schreiben.