it-swarm.com.de

Ändern Sie den Inhalt einer Datei mit Java

Ich möchte den Inhalt der Datei mit dem Java-Programm wie unten beschrieben löschen. Ist dies die Schreibmethode, die in derselben Datei ersetzt werden soll, oder sollte sie in die andere Datei kopiert werden. 

Aber es wird der gesamte Inhalt der Datei gelöscht.

class FileReplace
{
    ArrayList<String> lines = new ArrayList<String>();
    String line = null;
    public void  doIt()
    {
        try
        {
            File f1 = new File("d:/new folder/t1.htm");
            FileReader fr = new FileReader(f1);
            BufferedReader br = new BufferedReader(fr);
            while (line = br.readLine() != null)
            {
                if (line.contains("Java"))
                    line = line.replace("Java", " ");
                lines.add(line);
            }
            FileWriter fw = new FileWriter(f1);
            BufferedWriter out = new BufferedWriter(fw);
            out.write(lines.toString());
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
    public statc void main(String args[])
    {
        FileReplace fr = new FileReplace();
        fr.doIt();
    }
}
6
Adesh singh

Ich würde mit dem Schließen des Lesers und dem Flushwriter beginnen:

public class FileReplace {
    List<String> lines = new ArrayList<String>();
    String line = null;

    public void  doIt() {
        try {
            File f1 = new File("d:/new folder/t1.htm");
            FileReader fr = new FileReader(f1);
            BufferedReader br = new BufferedReader(fr);
            while ((line = br.readLine()) != null) {
                if (line.contains("Java"))
                    line = line.replace("Java", " ");
                lines.add(line);
            }
            fr.close();
            br.close();

            FileWriter fw = new FileWriter(f1);
            BufferedWriter out = new BufferedWriter(fw);
            for(String s : lines)
                 out.write(s);
            out.flush();
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String args[]) {
        FileReplace fr = new FileReplace();
        fr.doIt();
    }
}
12
Mateusz

Die akzeptierte Antwort ist großartig. Es gibt jedoch eine einfachere Möglichkeit, Inhalte in einer Datei mit der Apache-Bibliothek commons-io zu ersetzen (commons-io-2.4.jar - Sie können jede aktuelle Version verwenden).

private void update() throws IOException{
        File file = new File("myPath/myFile.txt");
        String fileContext = FileUtils.readFileToString(file);
        fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED");
        FileUtils.write(file, fileContext);
 }

Hinweis: Ausgelöst IOException muss von der Anwendung abgefangen und entsprechend behandelt werden.

9
Sandeep Salian

Gleichzeitiges Lesen + Schreiben in dieselbe Datei ist nicht in Ordnung.

BEARBEITEN: Um es besser zu formulieren und genauer zu formulieren - das Lesen und Schreiben in dieselbe Datei im selben Thread, ohne den Leser ordnungsgemäß zu schließen (und den Schreiber zu flammen), ist nicht in Ordnung.

3
acostache

Stellen Sie sicher, dass:

  • close ein beliebiger Stream, wenn Sie ihn nicht mehr benötigen
  • Insbesondere vor Wiedereröffnung für das Schreiben.
  • truncate die Datei, um sicherzustellen, dass sie schrumpft, wenn Sie weniger schreiben als geschrieben.
  • dann schreibe die Ausgabe
  • schreiben Sie einzelne Zeilen, verlassen Sie sich nicht auf toString.
  • flush und close, wenn Sie mit dem Schreiben fertig sind!

Wenn Sie gepufferte IO verwenden, müssen Sie immer sicherstellen, dass der Puffer am Ende geleert wird. Andernfalls können Daten verloren gehen!

2
Anony-Mousse

Ich kann drei Probleme sehen.

Zuerst schreiben Sie an out, wobei ich davon ausgehe, dass es sich um System.out handelt, nicht um einen Ausgabestrom in die Datei.

Zweitens: Wenn Sie einen Ausgabestrom in die Datei schreiben, müssen Sie ihn schließen.

Drittens schreibt die toString()-Methode für eine ArrayList die Datei nicht so, wie Sie es erwarten. Durchlaufen Sie die Liste und schreiben Sie jede String einzeln. Fragen Sie sich, ob Sie auch Zeilenumbrüche schreiben müssen.

0
Qwerky

Die akzeptierte Antwort ist etwas falsch. Hier ist der richtige Code.

    public class FileReplace {
List<String> lines = new ArrayList<String>();
String line = null;

public void  doIt() {
    try {
        File f1 = new File("d:/new folder/t1.htm");
        FileReader fr = new FileReader(f1);
        BufferedReader br = new BufferedReader(fr);
        while ((line = br.readLine()) != null) {
            if (line.contains("Java"))
                line = line.replace("Java", " ");
            lines.add(line);
        }
        fr.close();
        br.close();

        FileWriter fw = new FileWriter(f1);
        BufferedWriter out = new BufferedWriter(fw);
        for(String s : lines)
             out.write(s);
        out.flush();
                } 
        out.close();
   catch (Exception ex) {
        ex.printStackTrace();
    }
}
0
Ravi K M