# Einlesen und Auslesen einer Textdatei in Java



## Homiee (2. Mai 2009)

Hallo!!

Ich hab da ein Problem...und zwar hab ich folgende Aufgabenstellung bekommen.
Ich soll 6 Studenten zunächst unsortiert in eine Textdatei schreiben und abspeichern.
Die Textdatei sieht bei mir  so aus:
vorname hans
nachname Glück
telefonnummer 2345566
matrikelnummer 333344

usw....

Nun soll ich diese Textdatei einlesen und und die Studenten jeweils unsortiert in eine verkettete Liste einfügen....bei mir scheiterts schon beim einlesen dieser Textdatei...vorerst möchte ich nur die Datei einlesen und wieda ausgeben...hier mein bisheriges Programmstück.:

```
public class Ausführung {

	public static void main(String[] args){
		
	
	FileReader file=null;
	try{
	file = new FileReader("C:/Users/dok/Studenten.txt");
	}
	
	 catch (FileNotFoundException e) {
		e.printStackTrace();
	}
	 BufferedReader reader= new BufferedReader(file);
	System.out.println(file);
}
}
```
kann mir einer sagen was daran falsch ist
Es kommt folgender fehler:  java.io.FileReader@3e25a5 ...sieht so aus als müsst ich da noch ne toString Methode einbauen... ach ja...ich arbeite mit eclipse


----------



## Billie (2. Mai 2009)

Du lässt dir ja auch das Objekt FileReader auf die Konsole ausgeben und nicht etwas aus der Datei. Außerdem, warum erzeugst du einen BufferedReader wenn Du ihn nicht verwendest?

Der Dateiaufbau ist auch nicht sehr schieck, die übliche Methode ist eine CSV (Comma Seperated Value) zu erstellen. Das bedeutet jede Zeile in deiner Datei steht für einen Studenten. Du definierst einfach die Reihenfolge in deinem Programm (1. Vorname, 2. Nachname, 3. etc) und speicherst dann alles ab.

z.B.



> Vorname;Nachname;Telefonnummer;Martrikelnummer;etc.



Dann liest Du die Datei zeilenweise ein und zerlegst den String (deine Zeile) in einzelne Teile wobei das Komma (od. ein anderes Zeichen) dein Trennzeichen darstellt:


```
public static void main(String[] args) {
		
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(new File("datei.csv")));
			String line = null;
			while((line = br.readLine()) != null) {
				// Ganze Zeile:
				// System.out.println(line);				
				String[] parts = line.split(";");
				System.out.println("Vorname: " + parts[0]);
				System.out.println("Nachname: " + parts[1]);
				// ...
			}
		} catch(FileNotFoundException e) {
			e.printStackTrace();
		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			if(br != null) {
				try {
					br.close();
				} catch(IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
```


----------



## Shiso (2. Mai 2009)

Und vergiss nicht über die class die Java.io zu importieren.

Also: import.java.io.*;


----------



## Homiee (3. Mai 2009)

Hmmm sorry ich hab da was vergessen...und zwar sollen die Sudenten nicht in einem Array sondern in einer verketteten Liste gespeichert werden. 

 "String[] parts = line.split(";");"

Aber wenigstens hab ich das jetzt mit dem BufferedReader und FileReader verstanden. Kannst du mir da noch ein paar Tips geben wie ich das realisieren kann


----------



## Homiee (3. Mai 2009)

Habs jetzt so gemacht:

 br=newBufferedReader(newFileReader(newFile("C:\\Users\\doc\\Studenten.txt")));
           String line = null;
           while((line = br.readLine()) != null) {

               Node n=new Node();
               n.value=line;
               System.out.println(line);

und es funkt...Also in meiner Textdatei steht : hans;Müller;  und das bringt er mir auch so raus...muss erstma noch schauen wie ich so nen code besser hier reinpost  sorry
 foren hab ich bis jetzt nie besucht


----------



## Shiso (3. Mai 2009)

Wir hatten so eine ähnliche Aufgabe...
Muss es denn eine einfach verkettete Liste sein oder kann es eine Array Liste sein?
Aus dieser fand ich es  einfacher Objekte zu erzeugen.
Für diese brauchst du jedoch noch die java.util.
und alles was du zu der array Liste brauchst dürftest du in der Java api finden.


----------



## Homiee (3. Mai 2009)

Naja laut Aufgabenstellung gehts leider nicht im Array...mir ist da aber grad was aufgefallen. Wenn ich das so mache wie bisher:

public static void main(String[] args) {
	   BufferedReader br = null;
       try {
           br = new BufferedReader(new FileReader(new File("C:\\Users\\doc\\Studenten.txt")));
           String line = null;
           while((line = br.readLine()) != null) {

               Node n=new Node(line);
               n.value=line;
               System.out.println(line);
Die Klasse Node sieht bis jetzt bei mir so aus:

public class Node {

	public Object value;
	public Node next;
Node(Object v){
	value=v;
	next=null;
}
}

hab ich trotzdem einen denkfehler gemacht...wenn in meiner Textdatei steht: hans; Müller;07644-34567,262527
und in der zweiten Zeile auch nochma ein Student mit Name, Telefon, Matrikelnummer dann bringt er mir den kompletten Text. 

Muss ich es nicht so hinbekommen das die erste Zeile ein Studentenobjekt ist mit dem ich dann weiterarbeiten kann


----------



## Billie (4. Mai 2009)

Inwiefern "den kompletten Text"? Aber wenn Du meinst, dass die gesamte Datei auf der Konsole ausgegeben wird, hast Du recht:


```
while((line = br.readLine()) != null) {

Node n=new Node(line);
n.value=line;
System.out.println(line);
}
```

Außerdem ist die Zeile:


```
n.value=line;
```

überflüssig, da du dem Konstruktor von Node schon den value übergibst:


```
Node(Object v) {
value = v;
next=null;
}
```

Außerdem solltest Du die Attribute als private deklarieren, damit der obere Weg nicht mehr möglich ist - Teil der Objekt-Orientierten-Programmierung (OOP).


----------



## MiMi (4. Mai 2009)

Homiee hat gesagt.:


> muss erstma noch schauen wie ich so nen code besser hier reinpost  sorry
> foren hab ich bis jetzt nie besucht



Ganz einfach vor deinem code ein [.JAVA] und nach deinem code ein [./JAVA] OHNE die Punkte. Du kannst auch den Code einfuegen und markieren. Dann in der unteren Buttonleiste den 3. von rechts druecken (Raute symbol), dann erkennt er aber keine JAVA syntax.


----------



## Homiee (5. Mai 2009)

> Inwiefern "den kompletten Text"?



In meiner Textdatei steht ja

1.Objekt "Vorname;Nachname;;Telefonnummer;Matrikelnummer;
2.Objekt" Vorname;Nachname;;Telefonnummer;Matrikelnummer;
etc..

und er bringt mir ja jetzt erstma die kompletten Studentenobjekte, so zu sagen! Ich weiss jetzt nur nicht wie ich es schaffen kann die erste Zeile quasi zu 1 Studentenobjekt zu machen, die zweite Zeile zum 2 Studentenonjekt usw.,  ist es jetzt ein bisschen klarer


----------



## MiMi (6. Mai 2009)

Du liest einfach jede Zeile ein und erstellst ein neues Studentenobject pro Zeile. In der jeweiligen Zeile suchst du dir halt per split den Teil den du brauchst und steckst ihn in das erstellte object. 
So wie es billie oben schon beschrieben hatte

```
public static void main(String[] args) {
       
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(new File("datei.csv")));
            String line = null;
            while((line = br.readLine()) != null) {
                // Ganze Zeile:
                // System.out.println(line);               
                String[] parts = line.split(";");
                System.out.println("Vorname: " + parts[0]);
                System.out.println("Nachname: " + parts[1]);
                // ...
            }
        } catch(FileNotFoundException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            if(br != null) {
                try {
                    br.close();
                } catch(IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
```
Dort wo jetzt das System out ist, steckst du die Sachen in das Studentenobjekt


----------



## Homiee (9. Mai 2009)

Also, erstma danke das ihr euch Zeit genommen habt für mein Problem. Habs jetzt endlich so wie ich es haben wollte.

Habe also 4 Klassen erstellt, zum einen die Main, Klasse Studenten mit get und set Methoden für die Attribute Vorname Name Tele und Matrikelnummer, die Klasse Node für jeweils einen Knoten der verketteten Liste und die verkettete Liste als Klasse selbst die wie folgt aussieht:

```
public class Sort {
	
	 public Node head=new Node(null);
	//public Node tail=new Node(null);

	
	public void show(Person pers) {
		for(Node p=head; p!=null;p=p.next){
			System.out.println(p.element);
		}
	}
	public void sortierenMatrikel(Person pers ) {
		Node node=new Node(pers);
		if(head.next==null) {
			head.next=node;
		}
			else {
		for(Node p=head; p.next!=null; p=p.next) {
			 if(p.next.element.getMatrikelnummer()>node.element.getMatrikelnummer()) {
				 node.next=p.next;
				 p.next=node;
				 break;
				}
			 else {
				 p.next=node;
				 
			 }
				
			}
			for(Node p=head.next; p!=null; p=p.next) {
				System.out.println(p.element.toString());
			}
	  
		  }
	  
		  }
	  
	}
```
  Danke trotzdem nochma für den Support


----------



## fm it (25. März 2012)

Klappt alles gut in der Konsole aber wie ist das mit Grafiken müsste doch eigtlich einfach text.setText(line);
Aber das will er nicht machen...


----------



## sheel (25. März 2012)

Hi und Willkommen bei tutorials.de,

was genau meinst du?
Redest du von Bilddateien oder einer grafischen Oberfläche?
Mit welchem Code hast du es probiert?
Was passiert? Fehlermeldungen?


----------



## fm it (25. März 2012)

Grafische Oberflächen.
Ich habe ein Text Label das sich zu dem Inhalt vom Textdokument ändern soll wenn man auf einen button klickt.
Es passiert gar nicht keine Fehlermeldung.


----------



## sheel (25. März 2012)

Kannst du auch den problematischen Code zeigen?


----------



## fm it (25. März 2012)

```
FileReadWriteExample lu = new FileReadWriteExample();
    	
    	
    	button = new JButton ("Datenbank");
    	button.setBounds(10, 10 ,150,50);
    	button.addActionListener(lu);
    	button.setEnabled(true);
    	button.setToolTipText("Datenbank");
    	add (button);
public class FileReadWriteExample implements ActionListener {
	
	
	@Override
	public void actionPerformed(ActionEvent e2) {
		// TODO Auto-generated method stub
		
		if(e2.getSource()== button){
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(new File("C:/Users/FINN/Desktop/Datenbank.txt")));
            String line = null;
            while((line = br.readLine()) != null) {
               
               text.setText(line);
               
            }
        } catch(FileNotFoundException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            if(br != null) {
                try {
                    br.close();
                } catch(IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
```


----------



## sheel (25. März 2012)

Vllt. ist die letzte Zeile ja leer (nur ein Enter, dann Schluss)?
Mit deinem Code bleibt nämlich nur die letzte Zeile der Datei im Textfeld.
Schreib statt

```
text.setText(line);
```
mal das:

```
text.setText(text.getText() + " " + line);
```


----------



## fm it (25. März 2012)

Ja das klappt Dankeschön.
Aber jetzt schriebt er alles in eine Zeile. Ich wollte die Daten unteeinnander wie in der TExtdatei haben.


----------



## sheel (25. März 2012)

Das kann TextField nicht.
Nimm JTextArea.


----------



## fm it (25. März 2012)

Das geht schon da ich 3 textfelder habe und danach den Befehl
	
	
	



```
writer.write(System.getProperty("line.separator"));
```
Es wir duntereinander im Textdokument gespeichert. Aber beim Auslesen wird alles in einer Zeile angezeigt...


----------



## sheel (25. März 2012)

Dann mach doch drei readLine und speicher die Zeilen in die drei Textfelder?


----------



## fm it (25. März 2012)

meintest du Textdokumente?

aber das dürfte auch nichts änder da ich ja mehrere nutzer hintufügen will...


----------



## sheel (26. März 2012)

Bitte nicht pushen.

Hab leider keine Ahnung, was du mit dem letzten Post überhaupt meinst.

Du speicherst drei Zeilen in einer Datei, dann lies doch einfach wieder drei Zeile aus.
Zeile auslesen, zuweisen zum Tf1.
Zeile auslesen, zuweisen zum Tf2.
Zeile auslesen, zuweisen zum Tf3.


----------



## fm it (26. März 2012)

aber dann würd das ja so da stehen 
Vorname: Hans Vorname: Günter Vorname: Waldemar
Nachname= Meier Nachname Müller Nachname= Schmidt 
oder sehe ich da etwas falsch ichj ätte das gerne so:
Vorname: Hans Nachname Meier
Vorname: Günter Nachname: Müller
Vorname: Waldemar Nachname : Schmidt


----------



## sheel (26. März 2012)

Zeig einmal deine Datei


----------



## fm it (26. März 2012)

Vorname: Hans 		
Nachname: Meier		
Email: fg@fg.com

Vorname: max 
Nachname: Mustemann
Email: mustemann@max.com


----------

