Java Daten der ArrayList in einer Textdatei speicher und auch lesen?

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.718
Hey Community,

Ich hätte da mal eine Frage zu Java/Eclipse bzw. der ArrayList.

Ich habe den Code soweit geschrieben, dass ich alles in einer ArrayList schreibe und auch auf der Console abrufen kann.
Aber wie kann ich den die Daten in der ArrayList in eine Textdatei speichern, um sie wieder abrufen zu können, wenn ich mein Eclipse starte?

MfG und Vielen Dank :)
 
Da gibt es viele Möglichkeiten. Irgendein bestimmtes Format im Auge?

Ansonsten jeden Eintrag der Liste als String in eine eigene Zeile schreiben. Das geht seit Java 7 mit einer Zeile Code. Einlesen Analog.
 
Mir ist egal, wie er es abspeichert. Hauptsache ich kann es speichern und laden ;)
Nur wie geht das?
 
Die Klasse java.nio.file.Files bietet die von mir o.g. Methoden zum Schreiben und Lesen.
 
Hast du Objekte eigener Klassen in der ArrayList gespeichert oder Standard-Datentypen (int, String, ...)?
 
Kennst du Google?
Ich werf mal noch XML in den Raum. :D
 
Einfachste Variante ist eine CSV-Datei.
Da jeder mal klein anfängt, häng ich dir ein Code-Beispiel an:

Code:
public class Person {
    
    private String firstname;
    private String surname;
    private int age;
    
    public Person(String firstname, String surname, int age) {
        this.firstname = firstname;
        this.surname = surname;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return firstname + ";" + surname + ";" + age;
    }

}

Code:
public class Main {
    
    public static void main(String[] args) {
        ArrayList<Person> source = new ArrayList<>();
        ArrayList<Person> dest = new ArrayList<>();
        
        System.out.println(source.size());
        createSource(source);
        System.out.println(source.size());
        save(source);
        printList(source);
        
        System.out.println(dest.size());
        load(dest);
        System.out.println(dest.size());
        printList(dest);
    }
    
    private static void createSource(ArrayList<Person> source) {
        source.add(new Person("Max", "Mustermann", 29));
        source.add(new Person("Martina", "Musterfrau", 39));
    }
    
    private static void save(ArrayList<Person> source) {
        BufferedWriter writer = null;
        try {
             writer = new BufferedWriter(new FileWriter("savefile.csv"));
        } catch (IOException ex) {
            System.err.println(ex.toString());
        }
        String fileContent = "";
        for (Person p : source) {
            fileContent += p.toString() + "\n";
        }
        try {
            writer.write(fileContent);
            writer.close();
        } catch (IOException ex) {
            System.err.println(ex.toString());
        }
    }
    
    private static void load(ArrayList<Person> dest) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader("savefile.csv"));
        } catch (FileNotFoundException ex) {
            System.err.println(ex.toString());
        }
        String line;
        try {
            while ((line = reader.readLine()) != null) {
                String[] arr = line.split(";");
                int age = Integer.parseInt(arr[2]);
                Person p = new Person(arr[0], arr[1], age);
                dest.add(p);
            }
        } catch (IOException ex) {
            System.err.println(ex.toString());
        }
    }
    
    private static void printList(ArrayList<Person> list) {
        for (Person p : list) {
            System.out.println(p.toString());
        }
    }
    
}
 
ich glaube, die bei Java einfachste Lösung wäre, Serializable für die gegebenen Objekte zu implementieren. Dann lässt sich das Problem mit ein paar Zeilen Code lösen.

Hat aber auch nen Haufen Nachteile:
- Das Datenformat ist völlig intransparent
- Sobald du irgendetwas an der Struktur der Objekte änderst, und sei es nur die Reihenfolge der Member, kannst du alte Dateien nicht mehr lesen.
- Eigentlich lässt sich das nur mit MVC vernünftig benutzen. Wenn deine zu speichernden Objekte mehr können als speichern, fliegt man damit wahlweise schnell auf die Schnauze oder man bekommt hässlichen Code.

Edit: Mal allgemein: Wenn man jemandem schon 90 Zeilen Code an die Hand gibt, wäre es vielleicht nicht schlecht, den Code auch mal zu kommentieren, damit auch ein Anfänger kapiert, was da passiert.
 
Zuletzt bearbeitet:
onlineservices schrieb:
Einfachste Variante ist eine CSV-Datei.

Das ist definitiv nicht korrekt. Das geht viel einfacher.

Falls komplette Objekte serialisiert werden sollen, wäre das aber ohnehin nicht der richtige Ansatz. Die Runtime bietet hier zwar eine XML-Lösung (auch ein Einzeiler), aber ich würde dann lieber etwas von Drittanbietern nehmen.

Wobei sich die Frage wieder mal stark nach Hausaufgabe anhört und der TE nicht wirklich Initiative zeigt...
 
Die XML-Serialisierung in Java ist sehr langsam. Ist zwar einfach damit Objekt vollständig zu speichern, aber für System, die Last abbekommen in der Regel keine Option.

Die "händische" CSV Speicherung, die hier gepostet wurde ist doch gut und praktisch die Vorstufe um die Daten in einer Datenbank abzulegen.
 
LF-X schrieb:
Die XML-Serialisierung in Java ist sehr langsam. Ist zwar einfach damit Objekt vollständig zu speichern, aber für System, die Last abbekommen in der Regel keine Option.

Davon ist der TE vermutlich noch weit entfernt.


LF-X schrieb:
Die "händische" CSV Speicherung, die hier gepostet wurde ist doch gut und praktisch die Vorstufe um die Daten in einer Datenbank abzulegen.

Der gepostete Code nutzt die Möglichkeiten aktueller Runtimes nicht und hat (auch deswegen?) einige Defizite. Für mich keine akzetable Musterlösung.
 
mag sein, dass es nicht die Möglichkeiten aktueller Java-Versionen ausnutzt.

Dafür ist der Code praktisch in fast jede Sprache portierbar - und der Problemstellung angemessen.
 
soares schrieb:
Wobei sich die Frage wieder mal stark nach Hausaufgabe anhört und der TE nicht wirklich Initiative zeigt...

soares. Ich kann ja verstehen, dass manche hier misstrauisch sind. Aber ich höre in letzter Zeit nur noch, dass es hier um Hausaufgaben Hilfe geht ...

Ich will jetzt nicht aggressiv auf dich wirken. Aber es nervt langsam... Zudem sind gerade fast überall Ferien. Sprich ich mach es freiwillig!


An alle anderen. Vielen Dank!
Mit dem 90 Zeilen Code, konnte ich auch ohne Kommentare was anfangen ;)
 
soares schrieb:
Der gepostete Code nutzt die Möglichkeiten aktueller Runtimes nicht und hat (auch deswegen?) einige Defizite. Für mich keine akzetable Musterlösung.
Dem schließe ich mich an. Nicht alles was kompiliert und zufällig auf dem happy path den Zweck erfüllt, ist gute Software. Ich weiß ja nicht, wozu du das brauchst… wenn du jedoch auch nur den geringsten Qualitätsanspruch an deinen Code hast, verwirfst du das ganz schnell und löst es anständig. Der Code ist weder elegant noch zeitgemäß. Er ist einfach nur unnötig verbose. Ich schreib doch nicht zig Zeilen, wenn ich das gleiche in einer machen kann.
 
Tumbleweed schrieb:
Das wurde dir in #5 bereits verraten.

Schreiben

Lesen

Kann man bei "schreiben" das Trennzeichen definieren?

Wie flexibel ist "lesen", was das format der Datei angeht?

Was machen beide methoden, wenn das Trennzeichen ein Bestandteil des Spalteninhalts ist?
 
Zurück
Oben