PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FileWriter im J2SE v1.41_01



hpf
18-03-2003, 12:23
Hallo erstmal,
ich habe ein ganz kleines Problem.
Ich würde gerne einige werte zeile für zeile in eine Textdatei eintragen lassen, aber jedesmal, wenn ein neuer eintrag folgen soll, dann überschreibt er mir gleich die ganze datei.


try{
boolean last = false;
String line;
int i = 0;
while(!last){
line = fileIn.readLine();
i += 1;
fileIn.mark(i); if (line == null){
fileOut.write(param, 0, param.length()); fileOut.close(); out.println(hostFile.length()); out.println("all done");
last = true;
}

}catch(IOException e){
e.printStackTrace();
out.println("Something went wrong");
}
}
}

ich verzweifle noch daran,
vieleich hat ja jemand vo euch ne idee wie ich das lösen könnte?

euer hpf
BUTTON

maceop
18-03-2003, 12:42
hi,
kenn mich eigentlich nicht wirklich mit FileWriter aus, aber es scheint so als läge der Fehler hier :



fileOut.write(param, 0, param.length());


du schreibst doch hier ab Offset 0 den parameter 'param' in die Datei , so dass du jedes mal den Anfang "überschreibst" (oder liege ich da falsch ?)

mfg
maceop

hpf
18-03-2003, 12:49
hiho, ich habs geschafft :)

@maceop
fileOut.write(param, 0, param.length());

die werte hinter meinem String param, sind der start- und endcurser
innerhalb des zu schreibenden strings (also ich fange mit zeichen 0 von
param an und höre mit dem letzten zeichen auf)

es lag an der erzeugung des Writers:
Vorher(immer eine neue Datei):
fileOut = new BufferedWriter(new FileWriter(hostFile)
Nachher(ans ende der bisherigen):
fileOut = new BufferedWriter(new FileWriter(hostFile, true)

euer hpf

anda_skoa
18-03-2003, 14:18
Je nachdem wie das Programm aufgebaut ist, ist es vielleicht effizienter, wenn man den Stream nur einmal öffnet und erst am Ende wieder schliesst.

Ciao,
_

hpf
18-03-2003, 14:37
@ anda_skoa
das programm schreibt nur eine textzeile in die datei, danach ist dessen thread-lifecycle vorbei :) ist nix besonders großes

hpf

anda_skoa
18-03-2003, 15:04
Original geschrieben von hpf
@ anda_skoa
das programm schreibt nur eine textzeile in die datei, danach ist dessen thread-lifecycle vorbei :) ist nix besonders großes


Ah, sah durch die while Schleife wie ein wiederkehrender Vorgang aus.

Vielleicht kannst du dein erstes Posting nochmal editieren und den Code innerhalb von Codetags (# Button) formatieren.

Ciao,
_

hpf
18-03-2003, 15:42
da hab ich aber noch eine fage.
und zwar, kann man auch einzelne zeilen innerhalb einer textdatei löschen, wenn ich die textdatei zeile für zeile auslese ????
Das ganze ding soll nämlich später meine IP in einem Nameserver binden,
dabei wäre es schlecht wenn einträge "doppelt"(2 mal der gleiche name mit unterschiedlicher IP) auftauchen würden, dass könnte den Bind wahrscheinlich auf die dauer gut stressen :)

hpf

fs111
18-03-2003, 16:20
Für den Zugriff auf verschiedene Stellen in einer Datei, gibt es auch ein RandomAccesFile, weiß jetzt allerdings gerade nicht die Stelle in der Klassehierarchie.

fs111

hpf
18-03-2003, 16:41
ich hab mir das mal angesehen, aber ich denke nicht, dass ich das damir hinbekomme :( es gibt keine methode um einen String zu schreiben, nur Bytes getrennt durch ein oder (|), oder imt utf format, aber dann hängt der mir noch ein $remote vor den string. :(

fs111
18-03-2003, 18:47
und was ist hiermit?

writeChars

public final void writeChars(String s)
throws IOException

Writes a string to the file as a sequence of characters. Each character is written to the data output stream as if by the writeChar method. The write starts at the current position of the file pointer.

Specified by:
writeChars in interface DataOutput

Parameters:
s - a String value to be written.
Throws:
IOException - if an I/O error occurs.
See Also:
writeChar(int)

Ich meine, es sollte ja keinen Unterschied machen, ob er das geschriebene als chars oder als String behandelt. Außerdem kannst Du mit writeBytes auch Strings in eine Textdatei schreiben, das habe ich schon gemacht, und funktioniert super.

Der Code sieht dabei so aus:





fs111
private void saveHighscore(String s)
{
{


try
{
RandomAccessFile f1 = new RandomAccessFile("highscore.txt", "rw"); //creating a new RandomAccessFile
f1.seek(f1.length()); //this special feature of a RandomAccessFile finds the last bit of our file and puts the pointer to it
f1.writeBytes(s);//writes the passed bytes to the end of the file

f1.close(); //closes the RandomAccessFile
}
catch (IOException e) //we have to catch IOExceptions
{
System.out.println("Fehler beim Erstellen der Datei"); //displays an error message on the shell
}
}
}

peschmae
18-03-2003, 19:14
fs111 is back :) :D :D :D

das geht so wie beschrieben, aber


kann man auch einzelne zeilen innerhalb einer textdatei löschen, wenn ich die textdatei zeile für zeile auslese ????

wie geht das löschen :confused: :confused:

das habe ich früher auch schon ellenlang versucht bzw gesucht. Auch das Einfügen von Chars/Strings scheint irgendwie nicht möglich. Fehlt das in der API?

MfG Peschmä

hpf
18-03-2003, 19:31
ich kriega das damit nicht hin :(
lesen und schreiben klappt ja, aber ich kann immer noch nicht löschen :(

euer hpf

anda_skoa
18-03-2003, 19:55
Ich würds so machen.

Datei öffnen.
mit File.createTempFile eine temporäres File öffnen.
Aus der Datei zeilenweise lesen und nur neue ins Tempfile schreiben.

Datei schliessen.
Tempfile mit File.renameTo in Datei umbenennen.

Ciao,
_

hpf
18-03-2003, 20:02
danke, das ist ne gute idee.
ich werde das morgen mal ausprobieren :)
hpf

fs111
19-03-2003, 09:39
Hmm, man könnte sicherlich auch die Datei zeilenweise auslesen, und in eine Vector schreiben, in diesem dann doppelte Einträge suchen, und alles wieder in die Datei schreiben, aber das ist bestimmt sziemlich teuer, weil ja zimelich viele Stringoperationen vorgenommen werden müssen.

fs111

hpf
19-03-2003, 10:53
so, ich habe es nun hinbekommen, dass ich eine 2. datei habe, in der nun alle "einzigartigen" einträge aus datei 1 stehen. aber ich hab das gefühl, dass ich nur zu dämlich zum umbenennen bin :(

ich wollte es mit dieser Codezeile bewerkstelligen(der compiler meldet keine fehler):

hostFile.renameTo (new File"C:\\temp\\eclipse\\workspace\\netTest\\org\\hpf\\n etTest\\Server\\tmp.tmp"));

aber da tut sich nix :(

anda_skoa
19-03-2003, 11:25
Ist hostFile das Temp File?

Ich hab mit das in etwa so gedacht:



File ausgangsdatei
File tmpFile;

// kopierere eindeutige Einträg von ausgangsDatei in tmpFile

ausgangsDatei.delete();
tmpFile.renameto(ausgangsDatei);


Ciao,
_

peschmae
19-03-2003, 14:48
und irgendwas zum löschen/einfügen in Dateien gibts wirklich nicht?

MfG Peschmä

fs111
19-03-2003, 15:55
Also ich habe das immer so gemacht:

Ganze Datei einlesen: bei bekannter Größe in ein Stringarray, bei unbekannter in einen Vector, leeren String in die Datei geschrieben, und dann alles mit Veränderungen wieder rein geschrieben. Eine bessere Variante kenn ich nicht.

fs111