SearchReplace

yugox

Mitglied
Nabend,
kann mir einer verraten wie es genau bei Java mit "Search und Replace String" in einer Datei funktioniert?

Was ich nicht verstehe, bei mir findet er auf einmal 2x "pp" und ersetzt es durch "TEST".

Dann hätte ich noch eine Frage, wie funktioniert es, dass wirklich nur der String ersetzt wird, der auch gesucht wird, also nur die eine Zeile. Bei mir wird die komplette Formatierung geschrottet und alles ist dann in einer Zeile.

Außerdem würde es mich auch interessiert ob es bei java auch eine funktion, ähnlich wie bei Php die funktion "file_get_contants"

Meine TestTextdatei sieht so aus:
pp
tt
ff
gg

Der Momentane Code:
Java:
  public void ReadFile() throws IOException
  {
     FileReader freader = new FileReader(file_settings);
     BufferedReader reader = new BufferedReader(freader);
   
     while ((line = reader.readLine()) != null) {
       this.searchString += line;
     }
     
     reader.close();
     FileWriter writer = new FileWriter(file_settings);
     
     System.out.println(this.searchString);
     String result = searchString.replace("pp", "TEST");
     System.out.print(result);
  writer.write(result);
  writer.close();
  }

VIELEN DANK SCHON MAL AN ALLE HELFER!!! :)
 

NattleBet

Mitglied
Die FileReader.readLine() Methode liest zeilenweise aus, gibt aber nicht den Zeilenumbruch zurück. Beim Schreiben musst du diesen wieder anfügen.
Hinweis: Vermeide Seiteneffekte wie, eine Methode ReadFile zu nennen und drine wird etwas geschrieben.
wahrscheinlich willst du auch die Methode replaceAll verwenden, da replace nur das 1. vorkommen ändert.
 

Robat

Top Contributor
Hey yugox,

das er bei dir 2x "pp" findet muss an deiner Datei liegen.
Wie @NattleBet schon sagte, überträgt die Methode FileReader#readLine() den Zeilenumbruch nicht. Den kannst du aber einfach mit System.lineSeparator() einfügen.
Deine Anweisung in der while() müsste dann also so aussehen: this.searchString += line + System.lineSeperator().

Soweit ich weiß, gibt es in java keine Methode wie file_get_contents().
 

mrBrown

Super-Moderator
Mitarbeiter
wahrscheinlich willst du auch die Methode replaceAll verwenden, da replace nur das 1. vorkommen ändert.
replace ersetzt alle Vorkommen, der Unterschied liegt in der Verwendung von RegEx bei replace*

Außerdem würde es mich auch interessiert ob es bei java auch eine funktion, ähnlich wie bei Php die funktion "file_get_contants"

Am nähsten kommt dem Files.readAllLines, das gibt dir eine Liste aller Zeilen zurück. Kann man aber recht leicht joinen mit \n als Delemiter, dann hat man einen String
 

yugox

Mitglied
Erst einmal Vielen Lieben Dank euch allen für die schnelle und hilfreichen Antworten! :)

@NattleBet Die Benennung wird natürlich angepasst und erweitert, ich habe das erstmal nur so gemacht um die Funktion zum Laufen zu bekommen und zu verstehen, aber ich Danke Dir für den Hinweis :)

@Robat vielen Dank für den Tip mit dem System.lineSeparator(), sowas habe ich gesucht. Zu den 2x "pp" was ich ehrlich gesagt dennoch nicht woran es genau liegen kann, weil es eine .txt Datei ist und mehr als oben geschrieben steht da auch nicht drinne, ich weiß nicht wo er das zweite mal das "pp" erzeugt.

@mrBrown danke Dir für den Tip mit Files.readAllLines, ich werde mich mal da reinlesen :)
 

Robat

Top Contributor
Wie / wo initialisierst du denn deinen searchString?
Wenn deine .txt Datei wirklich nur
Code:
pp
tt
ff
gg
enthält, dann sollte er auch nur das finden und ersetzten.
 

yugox

Mitglied
Also hatte gesehen, dass ich vorher noch wo anders setSearchString();drinne hatte, daher kam das zweite "pp" und damit auch logischerweise die ersetzung zum TEST. Nun hatte ich das aber gelöscht und nun kommt dort:

Code:
nullTEST
tt
ff
gg

und searchString wird ja jetzt nur in der whileschleife initalisiert.

this.searchString += this.line + System.lineSeparator();


Hier einmal der ganze Code:
Java:
import java.awt.Image;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class SearchReplaceFunction {

    private File file_settings = new File("src/model/settings.txt");
    private File file_other = new File("src/model/Settings.java");
    private String searchString;
    private String replaceString;
    private Integer searchInt;
    private Integer replaceInt;
    private Image searchImage;
    private Image replaceImage;
    private String line;
      
    public void ReadFile() throws IOException
    {
        FileReader freader = new FileReader(this.file_settings);
        BufferedReader reader = new BufferedReader(freader);
   
        while ((this.line = reader.readLine()) != null) {
            this.searchString += this.line + System.lineSeparator();
        }
       
        reader.close();
        FileWriter writer = new FileWriter(this.file_settings);
       
        String result = this.searchString.replace("pp", "TEST");
        System.out.print(result);
        writer.write(result);
        writer.close();
    }


    public File getFile_settings() {
        return file_settings;
    }


    public File getFile_other() {
        return file_other;
    }

    public String getSearchString() {
        return searchString;
    }


    public String getReplaceString() {
        return replaceString;
    }


    public Integer getSearchInt() {
        return searchInt;
    }


    public Integer getReplaceInt() {
        return replaceInt;
    }


    public Image getSearchImage() {
        return searchImage;
    }


    public Image getReplaceImage() {
        return replaceImage;
    }


    public void setFile_settings(File file_settings) {
        this.file_settings = file_settings;
    }


    public void setFile_other(File file_other) {
        this.file_other = file_other;
    }
    public void setSearchString(String searchString) {
        this.searchString = searchString;
    }

    public void setReplaceString(String replaceString) {
        this.replaceString = replaceString;
    }


    public void setSearchInt(Integer searchInt) {
        this.searchInt = searchInt;
    }


    public void setReplaceInt(Integer replaceInt) {
        this.replaceInt = replaceInt;
    }


    public void setSearchImage(Image searchImage) {
        this.searchImage = searchImage;
    }


    public void setReplaceImage(Image replaceImage) {
        this.replaceImage = replaceImage;
    }
   
   
}
 

Robat

Top Contributor
und searchString wird ja jetzt nur in der whileschleife initalisiert.

Genau da liegt das Problem. Du solltest deinen Variablen immer einen default Wert zuweisen wenn du sie deklarierst. Bei Strings nimmt man üblicherweise einfach nur "".
Also schau dein Code mal durch und setz searchString und line auf "".
Bsp:
String line = "";
 

Neue Themen


Oben