Einlesen/Speichern von Strings aus einer Datei

javanoob88

Aktives Mitglied
Hallo,

Also: Es geht darum Personen mit den Attributen (int id, String name, String surname, int age, String gender) aus einer .txt Datei mit einem Reader einzulesen und zu speichern und zwar in folgender Form:
1. die erste Zeile soll übersprungen werde, da dort die Spaltennamen (Attribute) stehen
2. der String aus den Attributen (wurde zuvor mit einer toString Methode geschrieben) soll auseinandergenommen werden können, sodass einzelne Attribute sperat gespeichert werden können
3. eine Person soll (durch die Attribute repräsentiert) erstellt werden können
4. und gespeichert werden können

Hierzu der vorläufige Code.

Java:
import java.io.BufferedReader;

public class PersonFileReaderImpl extends AbstractPersonFileReader{

    private final Vector<Person> persons;
    
    public PersonFileReaderImpl(String readerType, Vector<Person> persons) {
        super(readerType);    
        this.persons = persons;
    }

    public void read(String fileName) throws FileNotFoundException, IOException {
        BufferedReader reader = IOUtils.getBufferedReader(fileName);//importiert
        String line = null;
        while ((line = reader.readLine()) != null) {
}
		reader.close();		
}
}
Der Rest passiert wohl in der while Schleife, leider stehe ich gehörig auf dem Schlauch.
zu 2. hatte ich mir gedacht, dass man für jede Zeile mit einer for Schleife durchgehen könnte und jeweils bis zum nächsten Strichpunkt (durch die die Attribute getrennt sind) gehen und sich den String holen. Aber wüsste auh nicht genau, wie ich die Zeile "durchgehe" und ob ich dazu nicht erst eine neue Datenstruktur bräuchte, in die ich das speichere
Und zum Rest will mir bisher nicht so wirklich was einfallen.
 

Der Müde Joe

Top Contributor
>IOUtils.getBufferedReader(fileName);//importiert

Wer blos immer den sch***** schreibt.

Java:
String str = "TITLE \nname;alter;blub\nhans;28;foo";
BufferedReader reader = new BufferedReader(new StringReader(str));
// BufferedReader reader = new BufferedReader(new FileReader(new File("foobar"))); // eigentlich so
String line = reader.readLine(); // lies mal eine Zeile vor
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

Und die line dann entsprechend parsen. zb String.split(";");
 

Michael...

Top Contributor
zu 1 & 2:
Java:
public void read(String fileName) throws FileNotFoundException, IOException {
        BufferedReader reader = IOUtils.getBufferedReader(fileName);//importiert
        String line = null;
        reader.readLine(); // Einlesen der ersten Zeile
        while ((line = reader.readLine()) != null) { //Einlesen ab der zweiten Zeile
                String[] lineContent = line.split(";"); //die Werte einer Zeile liegen jetzt als String Array vor
                //Verarbeiten des String Arrays bzw. erzeugen einen Personenobjekts (s.u.)
        }
        reader.close();
}
zu 3: Erstelle eine Klasse Person mit den entsprechenden Attributen als Membervariablen
zu 4: Was verstehst Du unter speichern? Die Daten sind doch bereits in dem Textfile gespeichert
 

ARadauer

Top Contributor
>IOUtils.getBufferedReader(fileName);//importiert

Wer blos immer den sch***** schreibt.

* @author Peter Donald
* @author Jeff Turner
* @author Matthew Hawthorne
* @author Stephen Colebourne
* @author Gareth Davis
* @author Ian Springer
* @author Niall Pemberton
* @author Sandy McArthur
* @version $Id: IOUtils.java 481854 2006-12-03 18:30:07Z scolebourne $
*/
public class IOUtils {

Apache Commons... ;-)
Find die wirklich praktisch!
 

Der Müde Joe

Top Contributor
>Apache Commons..

Jo klar...: getBufferedReader(fileName);//importiert

Wohl eher..die Uni deiner Wahl

Wobei die ist OK:
org.apache.commons.io.FileUtils.openInputStream(File)

EDIT:
ohh...ok...
meinte eigentlich eher: Für einen Java Anfänger werden immer diese Utils gemacht, welche
zwar früher oder später mal praktisch sind (FileUtils, StringUtils,...) aber in der Lernphase
genau am Ziel vorbei schiessen
 
Zuletzt bearbeitet:

javanoob88

Aktives Mitglied
Ich ignorier die letzten drei Posts einfach mal. Danke für die konstruktiven ersten beiden ;D
zu 4: Was verstehst Du unter speichern? Die Daten sind doch bereits in dem Textfile gespeichert
Michael... ist gerade online
Das man die Daten in den Speicher schreibt, um sie dann mit einem Writer wieder schreiben kann (der Writer ist dann zweiter Teil der Aufgabe, den ich dann hoffentlich alleine hinbekomme).
Es ist eine reine Übungsaufgabe. Denkt euch nicht allzuviel dabei ;D
 

Der Müde Joe

Top Contributor
Ist wohl ca so gedacht (so als kleine starthilfe)
Java:
public class PersonWriter {

    public static void main(String[] args) {
        Person[] persons = { new Person("hans", 12), new Person("maulwurf", 60) };
        writeToFile(persons);
    }

    // hier sollte dann ins file geschrieben werden (keine syso ;-)
    public static void writeToFile(Person[] persons) {
        System.out.println("TITLE LINE");
        for (Person person : persons) {
            System.out.println(person.toString());
        }
    }

    static class Person {

        private final String name;
        private final int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String toString() {
            return name + ";" + age;
        }
    }
}
 

javanoob88

Aktives Mitglied
Hey,

also die Person-Klasse habe ich schon, die sieht so aus:
Java:
package personFiles;

public class Person {

    private int id;
    private String name;
    private String surname;
    private int age;
    private String gender;

    public int getID() {
        return id;
    }

    public void setID(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Person(int id, String name, String surname, int age, String gender) {
    this.id = id;
    this.name = name;
    this.surname = surname;
    this.age = age;
    this.gender = gender;
    }

    public String toString() {
        return id + "; " + name + "; " + surname + "; " + age + "; " + gender;
    }
}

Nochmal zum Reader:
Es sollen die Personen ja in dem Vektor persons gespeichert werden können. Wie packe ich das denn in die while Schleife? Also ein Personen Objekt (=eine Zeile) pro Eintrag.
Kann ich das mit einer for schleife machen und irgendwie mit persons(i) auf den jeweiligen Vektoreintrag zugriefen?
Java:
while ((line = reader.readLine()) != null) { //Einlesen ab der zweiten Zeile
                    String[] lineContent = line.split(";");
Wird hier lineContent nicht jedesmal mit der aktuellen Zeile überschrieben? Es sollte denke ich eher so sein, dass für jede Zeile ein String Array erstellt wird. So könnte man ja dann auf alle Personenattribute der Textdatei zugreifen (z.b. in der form lineContent2[2] wäre dann der surname der Person aus Zeile 2). Ist das machbar?
In die Reader Implementierung soll keine main-Methode. Brauche ich dann noch eine Methode createPerson, um eine Person zu erstellen, oder wie war das gemeint?

Hoffe das war nun nicht allzu wirr formuliert. Danke.
 
Zuletzt bearbeitet:

Der Müde Joe

Top Contributor
um die ersten Bsp zurückzugreifen:
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;

public class PersonWriter {

    public static void main(String[] args) throws IOException {
        Person[] persons = { new Person("hans", 12), new Person("maulwurf", 60) };
        writeToFile(persons);
        System.out.println();
        // this should be in the file
        String str = "TITLE\n " + "name;28\n" + "hans;20\n";
        // load the Persons (from the file)
        Collection<Person> loadedPersons = readFromFile(str);
        writeToFile(loadedPersons.toArray(new Person[loadedPersons.size()]));
    }

    // hier sollte dann ins file geschrieben werden (keine syso ;-)
    public static void writeToFile(Person[] persons) {
        System.out.println("TITLE LINE");
        for (Person person : persons) {
            System.out.println(person.toString());
        }
    }

    public static Collection<Person> readFromFile(String str) throws IOException {
        // our loaded persons
        Collection<Person> result = new ArrayList<Person>();
        // some reader
        BufferedReader reader = new BufferedReader(new StringReader(str));
        // omit first line
        String line = reader.readLine();
        // as long as there are lines..read next line
        while ((line = reader.readLine()) != null) {
            // split line at ;
            String[] components = line.split(";");
            // first component: name
            String name = components[0];
            // second component: age (hopefully an int else NumberFormatException)
            int age = Integer.decode(components[1]);
            // create a new Person with the given info
            Person person = new Person(name, age);
            // add the person to the result
            result.add(person);
        }
        // return the result
        return result;
    }

    static class Person {

        private final String name;
        private final int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String toString() {
            return name + ";" + age;
        }
    }
}
 

Der Müde Joe

Top Contributor
>Der Methode sollte doch eigentlich der Vektor persons übergeben werden oder?

Ja.

Wobei Vector sollte man nicht mehr benutzen. Vector ist synchronisiert, und wurde lediglich angepasst, damit er ist Collection-Framework passt. Was man hingegen nehmen sollte ist eine List, (konkret ArrayList oder LinkedList).


>writeToFile(Vektor <> persons)

Code:
writeToFile(Collection<Person> persons)
oder
Code:
writeToFile(List<Person> persons)
oder
Code:
writeToFile(ArrayList<Person> persons)
oder
Code:
writeToFile(Vector<Person> persons

Jeweisl schlechter werdend ;-)
(Eine Collection kann alles sein. Eine List ist eine spezielle Collection mit der eigenschaft eine reihenfolge zu haben. Eine ArrayList ist
eine spezielle List, welche eine Reihenfolge besitzt und intern eine Array däfür benutzt. Ein Vector ist das gleiche jedoch sind alle Methoden synchronized und er ist ein "wenig" in die Jahre gekommen)

>.Es muss doch für jedes Personen Objekt im Vektor die toString Methode der Person Klasse ausgeührt werden....?!?

Code:
for(Person person : persons)
heisst ja
Code:
for each (Person person in persons)
Also geht er jede Person in persons durch.
 

timbeau

Gesperrter Benutzer
Wenn du eine .split() -Methode ausführst erhälst du ein Array mit String-Teilen. Also wäre gesplitteterString[0] z.B. der Vorname

jetzt kannst du für jede Reihe ein Objekt anlegen und dieses befüllen. Z.B.

Java:
Person person.setvorname = splittetStringArray[0]

usw.

Dann addest du das fertige Objekt in deine Collection und damit ist der Read-Teil fertig.

Wie du deine Collections wieder aufrufst ist auch sehr simpel und wurde schon beschrieben. Du musst allerdings nicht den Iterator nehmen, den man sich aber auf jeden Fall merken sollte (hab ich persönlich viel zu spät getan) sondern auch per for-Schleife deine Collection durchlaufen. Dazu gibts glaube ich die Methode .getAt(int index) oder sowas.
 

javanoob88

Aktives Mitglied
Ok danke, reader und writer habe ich prinzipiell soweit verstanden.
Jetzt soll man den writer noch erweitern können, so dass die einzelnen Personen über die Kommando Zeile eingegeben werden und damit ein File geschrieben werden kann. Also eingeben, Personen Objekte erstellen und in Vektor packen und dann erst in die Datei schreiben. Das ist doch dann einfach der umgekehrte Prozess wie beim Reader oder?
Über die Kommandozeile einlesen funktioniert glaube ich mit System.in ?
 

Der Müde Joe

Top Contributor
>Über die Kommandozeile einlesen funktioniert glaube ich mit System.in ?

Ja. Ich würde dir allerdings einen Scanner empfehlen. So als eines meiner FAQ Bsps die ich habe:
Java:
package ch.dmj.faq.mics;

import java.util.Scanner;


public class CmdReader {

    public static void main(String[] args) {
        // System.in is the command line
        // the scanner makes it easy to read
        Scanner scanner = new Scanner(System.in);
        // Welcome our user
        System.out.println("Hello. Please insert a number:");
        // runs forever: until: break
        while (true) {
            // waits until some input comes from the command line
            if (scanner.hasNext()) {
                // is the input as well a integer?
                if (scanner.hasNextInt()) {
                    // if so well done
                    int i = scanner.nextInt();
                    System.out.println("You typed an integer: " + i);
                    // well done: finish while
                    break;
                }
                // read the line
                String s = scanner.next();
                // print the input
                System.out.println("You did not type an integer: " + s);
                // well: do it again
                System.out.println("Try again: ");
                //start again while..
            }
        }
        // goodby
        System.out.println("Goodbye...");
    }
}

Natürlich ist es die frei wie du das liest. zb auch im Format name;age;gender in einer Zeile per next();
Oder per einfachen Frage. zB Bite geben sie einen Namen ein ..lesen...bitte geben sie ein alter ein..lesen...
Sie haben eine neue Person erstellt.....
 

timbeau

Gesperrter Benutzer
Eingaben z.B. über Scanner oder BufferReader()

Theoretisch kannst du jedes Objekt auch direkt in die Datei schreiben ohne den Vektor. Müsste mE auch gehen. Ist vielleicht nicht so performant aber das hab ich noch nie getestet.

Edith: Zu lahm ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Strings von Tastatur einlesen und in ArrayList speichern Java Basics - Anfänger-Themen 12
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
F Zahlen aus Datei einlesen und in Array speichern Java Basics - Anfänger-Themen 2
J Best Practice [Code Verbesserung] TXT einlesen und in Arrayliste speichern Java Basics - Anfänger-Themen 5
J Auslesen/speichern und wieder einlesen Java Basics - Anfänger-Themen 7
K String einlesen und als Variable speichern Java Basics - Anfänger-Themen 8
G Erste Schritte Textdatei einlesen und in Array speichern Java Basics - Anfänger-Themen 5
J .txt Datei "einlesen "und in String speichern ergibt immer NULL Java Basics - Anfänger-Themen 17
H Zeichenketten einlesen und dann in Array speichern Java Basics - Anfänger-Themen 6
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
H CSV Dateien einlesen, ändern, speichern in Jtable Java Basics - Anfänger-Themen 5
L Input/Output Text Dateien einlesen, bearbeiten und speichern Java Basics - Anfänger-Themen 9
S .txt einlesen->Zeilen ersetzen->neu.txt speichern Java Basics - Anfänger-Themen 13
E Einlesen einer int und speichern in einem Array Java Basics - Anfänger-Themen 7
M .txt datei "einlesen" und in String speichern! Java Basics - Anfänger-Themen 15
S Unbekannte Daten einlesen, speichern und in einem byte Array speichern Java Basics - Anfänger-Themen 3
G Objekte extern speichern und wieder einlesen Java Basics - Anfänger-Themen 2
G Objekte binär speichern und später wieder einlesen? Java Basics - Anfänger-Themen 7
M File einlesen und speichern Java Basics - Anfänger-Themen 4
M Datei einlesen & in Array speichern Java Basics - Anfänger-Themen 4
H Codetabelle Einlesen und in Array speichern Java Basics - Anfänger-Themen 1
S Einlesen einer Datei und ins Array speichern Java Basics - Anfänger-Themen 11
P Eine Datei einlesen und in einem Array speichern Java Basics - Anfänger-Themen 11
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
S SeriellenPort einlesen Java Basics - Anfänger-Themen 3
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
julian0507 Wörter einlesen lassen und rückwärts ausgeben Java Basics - Anfänger-Themen 7
S JSON einlesen und benutzen Java Basics - Anfänger-Themen 5
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
sserio Txt Datei einlesen Java Basics - Anfänger-Themen 9
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
G JSP Textfeld einlesen Java Basics - Anfänger-Themen 2
M Einlesen > new Leser Java Basics - Anfänger-Themen 5
W Werte durch Konsole einlesen Java Basics - Anfänger-Themen 10
A Array einlesen und ausgeben Java Basics - Anfänger-Themen 13
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
S Wort einlesen Array ausgeben Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
S CSV einlesen und mit Komma trennen Java Basics - Anfänger-Themen 12
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
J Csv-Datei einlesen Java Basics - Anfänger-Themen 52
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
L Datein einlesen Java Basics - Anfänger-Themen 1
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
A Textdatei mit stream einlesen Java Basics - Anfänger-Themen 2
P Datei einlesen und zurückgeben Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
M String in Scanner einlesen Java Basics - Anfänger-Themen 6
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
M Einzelzeichen einlesen Java Basics - Anfänger-Themen 2
C (char) Array einlesen Java Basics - Anfänger-Themen 8
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
E Einteilung der Räume mit einlesen einer .txt datei Java Basics - Anfänger-Themen 16
P Array einlesen von Konsole Java Basics - Anfänger-Themen 8
D Eingaben in String Array einlesen Java Basics - Anfänger-Themen 12
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
R Compiler-Fehler Einlesen von Konsolenparameter funtioniert nichtmehr Java Basics - Anfänger-Themen 4
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
H Einlesen Java Basics - Anfänger-Themen 8
H Einlesen von Zahlen Java Basics - Anfänger-Themen 20
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
R txt Einlesen und Verarbeiten Java Basics - Anfänger-Themen 15
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
K Sonderzeichen einlesen Java Basics - Anfänger-Themen 3
L Input/Output XML Datei einlesen (JAXB?) Java Basics - Anfänger-Themen 10
I Datei einlesen Java Basics - Anfänger-Themen 11
A Ungeordnetes Array ordnen, Zahl einlesen und einordnen Java Basics - Anfänger-Themen 23
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
C Erste Schritte Regex - Datei einlesen und splitten Java Basics - Anfänger-Themen 4
T Input/Output Einlesen eines .txt Files nur bei gesetztem Breakpoint möglich Java Basics - Anfänger-Themen 1
L RSA Public Key einlesen Java Basics - Anfänger-Themen 0
K Datei aus unbekannten Speicherorten einlesen Java Basics - Anfänger-Themen 1
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben