RandomAccessFile, wie String ersetzen

maggi2k9

Grünschnabel
Hi Commuity,

bin langsam am verzweifeln, suche schon Stunden nach einer Lösung für mein Problem.

Ich möchte ein Programm schreiben das es mir ermöglicht ein beliebiges Wort in einer Textdatei zu suchen und durch ein anderes zu ersetzen. Bin dann auf RandomAccessFile gestoßen, konnte aber aus den Code-Beispielen keinen Ansatz finden der mir weiterhilft.

Habe noch nicht viel Ahnung vom Programmieren, newbi Alarm :D
Hier mein Versuch das gesuchte Wort zu lokalisieren.

String suchbegriff = "Computer A";
String ersetzendurch = "volle Kaffeetasse";
String tmp = null;

public void suchenersetzen() throws FileNotFoundException, IOException {
RandomAccessFile f = new RandomAccessFile("c:\\test.txt", "rw");

tmp = f.readLine();
while(tmp != null) {
if(tmp.contains(suchbegriff)) {
long tmp2 = f.getFilePointer();
System.out.println(tmp2);
tmp = f.readLine();
}
else {
tmp = f.readLine();
}
}

f.close();
}

Bin für jede Hilfe Dankbar.
mfg maggi2k9
 
Hi,

die String- Klasse hat eine Funktion replace die das für dich macht.

etwa so:
Code:
tmp.replace(suchbegriff, ersetzendurch);


Aber die genau Definition der Funktion must du dir nochmal anschauen, hab die Parameter jetzt einfach so da reingesteckt, vielleicht gehören sie anders herum oder so.
 
Hi,

vielen Dank für den Tipp, hat soweit schonmal funktioniert. Konnte jetzt das Wort ersetzen. Was mir aber aufgefallen ist, sollte das neue Wort größer/länger sein als das alte, werden nachfolgende Zeichen einfach überschrieben. Wie kann ich das verhindern?

Hier mein Code:

Code:
	String suchbegriff = "Computer A";
	String ersetzendurch = "volle Kaffeetasse";
	String tmp = null;
		
	public void suchenersetzen() throws FileNotFoundException, IOException {
		RandomAccessFile f = new RandomAccessFile("c:\\test.txt", "rw");
		
		tmp = f.readLine();
		while(tmp != null) {
			if(tmp.contains(suchbegriff)) {
				long tmp2 = f.getFilePointer();
				long tmp3 = tmp.length();
				f.seek(tmp2 - tmp3);
				tmp = tmp.replaceAll(suchbegriff, ersetzendurch);
				f.writeBytes(tmp);
				tmp = f.readLine();
			}
			else {
				tmp = f.readLine();
			}
		}
		
		f.close();
	}
 
Du könntest die Datei komplett einlesen. Den eingelesenen String im Arbeitsspeicher manipulieren und danach wieder in die Datei schreiben ...
 
Als Übung kannst du das natürlich so machen.
Allerdings solltest du nicht vergessen das es auch Textdateien gibt die nicht in den Arbeitsspeicher passen. Was würde man dann machen?

Ich denke ich würde eine zweite "temporäre" Datei anlegen in die ich schreiben würde. So das man eine Datei hat aus der man liest und eine in die man schreibt.
Am Ende kann man sich dann den Dateinamen holen und die alte durch die neue ersetzen.
 
Hi,

ich habs jetzt mit der zweiten temporären Datei gelöst. Hier der Code vielleicht kann ihn ja noch ein anderer gut gebrauchen. Vielen Dank nochmal für die Tipps, mfg maggi2k9 :-)

Code:
	String suchbegriff = "Computer A";
	String ersetzendurch = "volle Kaffeetasse";
	String tmp = null;
	File neuedatei = new File("c:\\test2.txt");
	File altedatei = new File("c:\\test.txt");

	public void suchenersetzen() throws FileNotFoundException, IOException {
		RandomAccessFile f = new RandomAccessFile("c:\\test.txt", "rw");
		BufferedWriter b = new BufferedWriter(new FileWriter("c:\\test2.txt", false));
		
		tmp = f.readLine();
		while(tmp != null) {
			if(tmp.contains(suchbegriff)) {
				tmp = tmp.replaceAll(suchbegriff, ersetzendurch);
				b.write(tmp);
				b.newLine();
				tmp = f.readLine();
			}
			else {
				b.write(tmp);
				b.newLine();
				tmp = f.readLine();
			}
		}
				
		f.close();
		b.close();
		
		if(altedatei.exists() && neuedatei.exists()) {
			altedatei.delete();
			neuedatei.renameTo(altedatei);
		}		
	}
 

Neue Beiträge

Zurück