# Arraylist in Txt Datei speichern und auslesen



## Creeep (25. Mai 2010)

Moin allerseits,

Direkt zu anfang: Seit nicht zu hart mit mir ich bin ziemlicher Anfänger und habe bestimmt viele Fehler drinnen.

also Geschichte ist Folgende:
Ich habe einen zufallsgenerator gebastelt,
zuerst habe ich eine Arraylist wo ich die Namen einfüge.
Danach wird diese in einen Iterator umgewandelt und durchgemixxt.
Danach werden die Namen in JLabels angezeigt.
Nun möchte ich halt das diese ArrayList oder der Iterator (Was leichter ist) 
als .txt gespeichert wird und ich diese später auch wieder auslesen kann.

So weit bin ich schonmal:


```
// Deklarieren der Variablen

ArrayList<String> list = new ArrayList<String>();

Iterator<String> itNamen = list.iterator();

String line;

BufferedReader in = new BufferedReader(new Filereader("9IF.txt")); 
 // Error:unreported Exception java.io.FileNotFoundException; must be caught or declared to be thrown


// Die Mischen Funktion:

Collections.shuffle(list);

for (JLabel labelx : alleMeineLabels) {  //Schleife über alle JLabels
        if (itNamen.hasNext()) { //Sicherheitsabfrage: Gibt es noch weitere Einträge in der Liste
            labelx.setText(itNamen.next()); //Nächster Eintrag aus der Liste (bzw. dem Iterator) wird auf das Label gesetzt.
        } else {
            labelx.setText("Niemand"); //Sollte vermutlich nicht vorkommen
        }
    }


//auslesen:
FileNotFoundException fnfe; {
      System.out.println("Datei nicht gefunden!");
    }
    IOException ioe; {
      System.out.println("Fehler beim Lesen!");
    }


while((line = in.readLine()) != null){  
//Ich oute das hier gleich mal als kopiert.kann mir einer Erklären warum nach dem While 2 Klammern kommen müssen?
//wenn ich eine Lösche meint der wieder was mit nem Error das er ne Boolean braucht und ich ihm ne String vorsetze
list.add(line);
}
in.close();
// Error:unreported Exception java.io.IOException; must be caught or declared to be thrown
```


----------



## Michael... (25. Mai 2010)

Du willst ja vermutlich nicht die Liste, sondern deren Inhalt in die Datei schreiben. Dabei ist es egal ob Du direkt über die Liste iterierst oder per Iterator
Zum Schreiben in Textdateien:JavaInsel#Mit dem FileWriter...
Das mit der for Schleife über die Labels und darin den Iterator verwenden ist merkwürdig. Der Inhalt der Labels steht doch in der Liste...

```
while((line = in.readLine()) != null){
```
Die zwei Klammern hier brauchst Du weil Du in der booleanschen Abfrage eine Anweisung bzw. Zuweisung hast. Man könnte das auch zerlegen.

```
line = in.readLine();
while(line != null) {
    ...
    line = in.readLine();
}
```


----------



## Creeep (26. Mai 2010)

Ich glaube das mit der booleanschen Abfrage habe ich jetzt verstanden.

Also zu dem FileWriter:

Ich habe das zwar so weit hinbekommen das er eine neue Datei erstellt und dort etwas reinschreibt, nur ist da wieder ein Problem mit der Liste.
Ich habe folgendes Versucht:


```
fw.write(list<1>);   // Er weigert sich mit den <> Klammern und mit einer int zu arbeiten

fw.write(list[1]);    // Auf diese Art werden Arrayinhalte angezeigt und das funktioniert bei der liste
                          //nicht
list.toArray();        // Gibt keine Errors aus aber ich kann die Array nicht benennen bzw. weiß den 
                          //Namen nicht
```

Falls jemand weiß wie ich die Inhalte der Liste schreiben kann wäre das ne große Hilfe, in den API Docs habe ich jedenfalls nichts sinnvolles gefunden.

@ Michael... 
Ich weiß nciht ob ich deine Frage so richtig verstanden habe aber die Schleife über alle Labels ist dort weil der Inhalt gerade nicht in den Labels steht.
Er wird über ein Eingabefeld in die Arraylist geschrieben und gespeichert und soll nachher in den 26 Labels ausgegeben werden.


MfG


----------



## Sempah (26. Mai 2010)

ArrayList (Java 2 Platform SE 5.0)


```
fw.write(list.get(i));
```


----------



## Creeep (31. Mai 2010)

Also das Speichern funktioniert hervorragend.
Es wird die ganze Liste übernommen.
Falls es jemand noch interressiert habe ich i mit ner Gezählten Schleife verbunden wodurch die Einträge schön nacheinander übernommen wurden.

Kann mir jetzt jemand erklären wie ich die Datei wieder auslese?
Irgendwelche Befehle um die Datei zu finden oder etwas in der Art?


----------



## truesoul (31. Mai 2010)

warum denn finden ? 
Du weißt doch wo sich die Datei befindet? 
Oder hast du mehrere Dateien und du möchtest eine Datei von vielen auswählen? 

```
JFileChooser()
```
 z.B

Ansonsten weißt du doch wie man Textdateien auslesen kann ... siehe Beiträge ?!?

Mfg


----------



## Creeep (31. Mai 2010)

naja wie gewonnen so zeronnen

Ich habe versucht einige Änderungen vorzunehmen und jetzt funktioniert das Speichern auch nicht mehr.

Ich habe alle Änderungen rückgängig gemacht und trotzdem will ers nicht starten.

In dem Stück quelltext hat er die Probleme soweit ich weiß

```
FileWriter fw = null;
        try{
  fw = new FileWriter("Java.txt");
  for(int i=0;i!=26;i++){
  fw.write(list.get(i)); //<--- Genau hier will er nicht mehr, aber anstatt list.get z.B. "Test" macht er.
  fw.append(System.getProperty("line.separator") ); // e.g. "\n"
  }
        }
catch ( IOException e ) {
  System.err.println( "Konnte Datei nicht erstellen" );
}
finally {
  if ( fw != null )
    try { fw.close(); } catch ( IOException e ) { }
}
```

Und die Errors sehen wie folgt aus:

```
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.RangeCheck(ArrayList.java:547)
        at java.util.ArrayList.get(ArrayList.java:322)
        at Sitzordnung.Datei_speichernActionPerformed(Sitzordnung.java:437)
        at Sitzordnung.access$300(Sitzordnung.java:38)
        at Sitzordnung$4.actionPerformed(Sitzordnung.java:228)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```

Ich bedanke mich im vorraus für die Hilfe und hoffe mir ist zu helfen

MfG


----------



## nrg (31. Mai 2010)

deine liste ist leer und deine schleifenbedingung i!=26 ist auch nicht grad so gut gewählt. versuch mal 
	
	
	
	





```
i < list.size()
```
 oder einfach foreach 
	
	
	
	





```
for ( String s : list ) {...
```

danach kannste dir überlegen, warum deine liste leer ist


----------



## Creeep (3. Jun 2010)

Dankesehr nrg, einen Befehl wie .size habe ich schon lange gesucht aber irgendwie nie was gefunden.
Aber ich würde gerne wissen wie du das Herausgefunden hast. kannst du die Errors klar lesen?

Die Liste war leer weil die errors auftauchten egal was drin war, also hab ich direkt auf "Speichern" gedrückt^^

nunja ich hätte da noch einige Probleme.
mit 
	
	
	
	





```
fw = new FileWriter("Java.txt");
```
 kann man ja den Namen angeben.
Ich habe jetzt noch eine Texteingabe eingebaut mit dem der Name selbst schreiben kann.
aber wenn ich 
	
	
	
	





```
fw = new FileWriter(String + ".txt");
//oder 
fw = new FileWriter(DateiName);
//DateiName = Texteingabe
```
  mache klappt das nicht so ganz.
Gibts da irgendwelche möglichkeiten?


----------

