# Array in eine Datei Schreiben und wieder auslesen



## Milliways (20. Sep 2007)

kann mir da wer bei meinem Problem weiter helfen:

Ich habe ein solches Array:

```
HighscoreCompare[] topten = new HighscoreCompare[hsgroesse]; //Füllen des Arrays mit den Vorschriften von HighscoreCompare.java

         //Vorwerte
         //new HighscorCompare("vorname(String)", "nachname(String)", punktestand(int)),
          topten[0] = new HighscoreCompare("0A", "A.", 1);
          topten[1] = new HighscoreCompare("1B", "B.", 5);
          topten[2] = new HighscoreCompare("2C", "C.", 2);
          topten[3] = new HighscoreCompare("3D", "D.", 5);
          topten[4] = new HighscoreCompare("4E", "E.", 8);
          topten[5] = new HighscoreCompare("5F", "F.", 9);
          topten[6] = new HighscoreCompare("6G", "G.", 3);
          topten[7] = new HighscoreCompare("7H", "H.", 7);
          topten[8] = new HighscoreCompare("8I", "I.", 6);
          topten[9] = new HighscoreCompare("9J", "J.",4);
```

und möchte das in eine Datei schreiben und wen die Datei Existiert soll er mir das ganze aus der Datei raus lesen und wieder in so ein Array basteln.


----------



## NTB (20. Sep 2007)

Such mal nach "Serialisierung" bzw "Serializable" und "ObjectOutputStream"


----------



## madboy (21. Sep 2007)

Die Alternative wäre eine CVS-Datei. Das hätte unter anderem den Vorteil, dass man zum Testen oder warum auch immer von Hand in die Datei schauen kann und evtl. was ändern.

Beispiel (nicht lauffähig!)

```
BufferedWriter writer = new BufferedWriter(new FileWriter("bla.txt"));
for(HighscoreCompare hc : topten) {
  writer.write(hc.get(bla)); //oder halt irgendwie so ähnlich ;-) 
  writer.write(';');
  writer.write(hc.get(blubb)); 
  writer.write(';');
  writer.write(hc.get(abc)); 
  writer.newLine();
}
writer.flush();
writer.close();
```

Beim Lesen halt genau anders herum mit BufferedReader.

edit: hatte das flush() vergessen...


----------



## NTB (21. Sep 2007)

kleinkariert: Das flush ist unnötig. Die erste Zeile in der Methode "public void close()" lautet "flush()"


----------



## Nuke (21. Sep 2007)

CSV Datei in Array einlesen der weg andersrum dürfte dann klar sein ;-)


```
public void  readfile()
    {   
    	
    try
       {                  
         BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(absolutePath)));
         String line;    
         int zeile=0;           
         int anzahlToken; 
         
         while((line = file.readLine())!= null )
         {  
	           mytokenizer = new StringTokenizer (line,";");
	           anzahlToken = mytokenizer.countTokens();	          
	           	   
	           for(int i=0; i < anzahlToken; i++)
	           {	        	   
	        	   tabellendaten [zeile][i] = mytokenizer.nextToken(); 
	           }      
        }        
               
        file.close(); 
       }
       
       catch (Exception e)
       {
          e.printStackTrace();
       }
    }
```

beispiel auch net lauffähig, da manche variablen nicht local deklariert sind in der methode.


----------



## Milliways (21. Sep 2007)

Also ich habe das ganze jetzt gelößt indem ich mit Serializable das ganze object speicher und dann wieder einlese.

Hat sich nun leider ein Problem aufgetan ich würde gerne aus der lade Methode meine topten wieder übergeben (return oder anders)



```
saveMap(topten, "hs.dat");*/
		HighscoreCompare[] topten;
		loadMap("hs.dat");
		
		//das geladen object muss an dieser Stelle wieder in meine topten Array Variable!
		for (int i=9; i>=0 ; i--)
		System.out.println(topten[i]+" ");


	}

	public static void saveMap(HighscoreCompare[]array, String filename )
	{
		try
		{
			FileOutputStream fos = new FileOutputStream(filename);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(array);
		}
		 catch( IOException ex )
			 {
				System.out.println( ex.getMessage() );
			 }

	}

		public static void loadMap(String filename )
		{
			
			try
			{

				FileInputStream fis = new FileInputStream(filename);
				ObjectInputStream ois = new ObjectInputStream(fis);
				HighscoreCompare[] topten; = (HighscoreCompare[])ois.readObject();
				//for (int i=9; i>=0 ; i--)
				//System.out.println(topten[i]+" ");
				
				//hier return was?
				

			}
			catch( IOException ex )
			{
					System.out.println( ex.getMessage() );
			}
			catch(ClassNotFoundException e)
			{
				System.out.println(e);
			}
```


----------



## madboy (21. Sep 2007)

Milliways hat gesagt.:
			
		

> ```
> ...
> //hier return was?
> //hier return topten;
> ...


----------



## Milliways (21. Sep 2007)

return topten; währe mir schon klar, aber ich kann ja aus einer void methode kein Wert zurück geben.


----------



## madboy (21. Sep 2007)

Hmmmmm. Genau das meinte ich mit 





> das reicht aber noch nicht ganz. Was noch wo hin muss darfst selber überlegen ;-)



Hättest du in "Anfängerfragen" geschrieben, hätte ich wohl auch gleich dazu geantwortet, dass du natürlich "void loadMap" durch "HighscoreCompare[] loadMap" ersetzen musst  :wink:


----------



## Milliways (22. Sep 2007)

Ja schon klar aber dann schreit er mit imme noch das die varible topten nicht initialisiert ist und ich keinen rückgabewert habe.


----------



## madboy (22. Sep 2007)

Milliways hat gesagt.:
			
		

> Ja schon klar aber dann schreit er mit imme noch das die varible topten nicht initialisiert ist und ich keinen rückgabewert habe.


Irgendwie irritiert mich zwar dein "Ja schon klar" (so klar kann es ja nicht gewesen sein, sonst hättest nicht gefragt) aber egal  :wink: 

On Topic:
Initialisiere die Variable.

```
HighscoreCompare[] topten = new HighscoreCompare[1];
//oder 
HighscoreCompare[] topten = null;
```

Wenn es wieder nicht klappt, poste bitte ein minimales lauffähiges Beispiel, das zeigt was genau du machen willst. Meistens wird einem beim Zusammenbasteln des Beispieles dann nämlich selber klar, was los ist und der Lerneffekt ist viel größer, als wenn hier Lösungen gepostet werden.


----------

