ArrayList - Methode zum Speichern eines Eintrags in einer Datei

Hallo zusamen ). Bitte um Hilfe.
Code:
public class Test {

    static ArrayList <String> liste = new ArrayList<>();
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static String dateiname = "test.txt";
  
    
     static void writeToFile(String dat) {
        try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dat)))) {
            for(String c : liste) {
              writer.write(c);
                System.out.println("Neuer Eintrag wurde gespeichert");
            }
        } catch (IOException e) {
            e.printStackTrace();
          
        }
    }

Nach Aufgabenstellung soll ein neuer Eintrag in bereits vorhandene Datei gespeichert werden. Das Problem, dass bei mir der neue Eintrag tatsächlich gespeichert wird, jedoch alle ältere Einträge werden gelöscht.

Was habe ich falsch gemacht?

liste.add(writer); statt writer.write(c) geht nicht... (
 
https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/io/FileOutputStream.html#<init>(java.io.File,boolean)
(mit append = true)
Statt:
Java:
new FileOutputStream(dat)
also:
Java:
new FileOutputStream(dat, true)

Gleich noch eine Frage: zum Löschen aus einer datei geht leider auch nicht
Code:
    public static ArrayList<String> loescheEintrag () {
    System.out.println("Bitte geben Sie Name, die gelöscht werden soll");
    try {
        String name = br.readLine();
         liste.remove(name.toString());
         return liste;
    } catch (Exception e) {
        System.out.println("Eingabefehler");
    }

    }
 
Du lädst die Datei in eine Liste, dann Löschen, dann was auch immer ansteht, speichern usw.

Nebenbei, schon was von Annotations gehört?
Leider habe nicht ganz richtig verstanden, was du meinst.
Du lädst die Datei in eine Liste
- ich lade Eintrag in eine datei, danach sollte es auch möglichkeit bestehen, einen anderen oder gleichen Eintrag aus dieser Datei zu löschen.
 
Leider habe nicht ganz richtig verstanden, was du meinst.
Er meint, dass Du erst einmal alle Einträge aus der Datei in eine geeignete Datenstruktur einlesen sollst, dann aus dieser Datenstruktur den gewünschten Eintrag entfernst und abschließend die geänderten Daten wieder in die Datei schreibst. Für einen solchen Zweck eignet sich insbesondere eine Liste als Datenstruktur (s. java.util.List), denn diese ist dynamisch und geordnet.
 
Danke! Hab die Lösung teilweise verstanden, aber richtig umsetzen kann immer noch nicht:

Code:
    public static void loescheEintrag () {
    System.out.println("Bitte geben Sie das, was gelöscht werden soll");
    ArrayList<String> liste2 = (ArrayList) liste.clone();
    try {
        String name = br.readLine();
         liste2.remove(name);
         ArrayList<String> liste = (ArrayList) liste2.clone();
    } catch (Exception e) {
        System.out.println("Eingabefehler");
    }
    }
 
Also:
Da ist ein Zettel, auf dem Du was ändern sollst.
a) Du erzeugst eine Kopie des Zettels (Wäre der clone() Aufruf bei Dir)
b) Auf der Kopie änderst Du etwas. (liste2.remove)
c) Dann schmeisst Du die Kopie weg (Lokale Variable hält die Kopie, d.h. der Garbage Collector kümmert sich dann um die Kopie)

==> Ja, wieso ist der Zettel nach dem Vorgehen unverändert?
 
Skizze (kann Fehler enthalten):
Java:
public static List<String> read() throws IOException {
    try(BufferedReader reader = new BufferedReader(new FileReader(dateiname))) {
        String line;
        while ((line = reader.readLine()) != null) {
            result.add(line);
        }
    }
}

public static void write(List<String> lines) throws IOException {
    try(PrintWriter writer = new PrintWriter(new FileWriter(dateiname))) {
        for (String line : lines) {
            writer.println(line);
        }
    }
}

public static void remove() throws IOException {
    List<String> lines = read();
    // z. B. die 5. Zeile entfernen
    if (lines.size() > 4) {
        lines.remove(4);
    }
    write(lines);
}
 

Zurück
Oben