# ganz am schluss einer datei was hineinschreiben



## huhunde (26. Mai 2006)

Hi,

nachdem ich nun endlich minimax-algorithmus gepackt habe, will ich nun die Highscore-Liste machen. das lesen der datei und ausgeben is kein problem, aber wie schreibe ich ganz hinten bei der datei noch nen eintrag hin !? bzw wie kann ich dass dann am besten sortieren !?

also..in highscore.txt steht das dann so:
Patrick 58
Stefan 32
Christina 29
Manuel 12

..also..name und dann die punkteanzahl

Hier mal mein code bei dem ich nur lese:


```
public void loadHighscore(Container list) {
		File file = new File("Highscore.txt");

		list.setLayout(new GridLayout(10,1));
		
		try {
			FileWriter out = new FileWriter(file);
			FileInputStream is = new FileInputStream(file);
			Reader r = new BufferedReader(new InputStreamReader(is));
   			StreamTokenizer st = new StreamTokenizer(r);
   			st.parseNumbers();
   			st.wordChars('A','Z');
   			st.wordChars('a','z');
   			st.nextToken();
   			int i = 1;
   			while(stype != StreamTokenizer_EOF) { // End of File
   				if(stype != StreamTokenizer_WORD) {
   					throw new IOException("Not a word");

   					
   				}
   				String name = st.sval;
   				
   				st.nextToken();
   				if(stype != StreamTokenizer_NUMBER) {
   					throw new IOException("Not a number");
	
   				}
   				double nOfHighscore = st.nval;	
   	   			st.nextToken();
   	   			System.out.println("Name" + name + " Highscore:" +nOfHighscore);
				int zahl = 100;
			//	out.write(playername); ..hier wollte ich etwas hinten dran schreiben aber dann überscreibe ich wieder die datei :(
			//	out.close(); 
   				toplist[i] = new JLabel(name);

   				toplist[i+1] = new JLabel(Double.toString(nOfHighscore));
   				list.add(toplist[i]);
   				list.add(toplist[i+1]);
   				i++;
   			}
   				
			

		}catch (IOException e) {
			System.out.println("Problem beim Lesen "+file.getName());

		}
```

Naja, ich hoffe mir kann wer weiterhelfen

mfg


----------



## Thomas Darimont (26. Mai 2006)

Hallo!

Also ans Ende einer Datei anfuegen koenntest du Beispielsweise in dem du denn entsprechenden FileWriter Konstruktor verwendest:
FileWriter(File file, boolean append) --> ... new FileWriter(new File("c:/foo.dat"),true);

Gruss Tom


----------



## huhunde (26. Mai 2006)

hmmm

wie meinst du das genau ? 

bzw weist du auch wie ich das am besten sortieren soll !?


----------



## Thomas Darimont (26. Mai 2006)

Hallo!

Du wolltest ans Ende der Datei schreiben... das geht mit dem beschreibenen FileWriter Konstruktor. Aber das hast du dich wohl 

Eine Moeglichkeit waere folgendes:

```
/**
 * 
 */
package de.tutorials;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author Tom
 * TODO propper resource cleanup ...
 *
 */
public class HighScoreExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        HighScoreManager highScoreManager = new HighScoreManager(new File("c:/highscores.txt"));
        
        highScoreManager.addHighScoreEntry(new HighScoreEntry("Heino",10));
        highScoreManager.addHighScoreEntry(new HighScoreEntry("Chris",5000));
        
        highScoreManager.printHighScoreTable();
    }
    
    static class HighScoreManager{
        
        File highScoreFile;
        Set<HighScoreEntry> highScoreEntries;
        
        public HighScoreManager(File highScoreFile){
            this.highScoreFile = highScoreFile;
            this.highScoreEntries = new TreeSet<HighScoreEntry>();
            init();
        }
        
        private void init() {
            try {
                if(!highScoreFile.exists()){
                    highScoreFile.createNewFile();
                }
                BufferedReader bufferedReader = new BufferedReader(new FileReader(this.highScoreFile));
                String line = null;
                while((line = bufferedReader.readLine())!= null){
                    HighScoreEntry highScoreEntry = parseHighScoreEntry(line);
                    highScoreEntries.add(highScoreEntry);
                }
                bufferedReader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        private HighScoreEntry parseHighScoreEntry(String line) {
            String[] items = line.split(" ");
            return new HighScoreEntry(items[0],Integer.parseInt(items[1]));
        }

        public void addHighScoreEntry(HighScoreEntry entry){
            highScoreEntries.add(entry);
            syncHighScoreEntriesToDisc();
        }

        private void syncHighScoreEntriesToDisc() {
            try {
                PrintWriter printWriter = new PrintWriter(new FileWriter(this.highScoreFile));
                for(HighScoreEntry entry : this.highScoreEntries){
                    printWriter.println(entry.toString());
                }
                printWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        public void printHighScoreTable(){
            int i = 1;
            for(HighScoreEntry entry : this.highScoreEntries){
                System.out.println((i++) +  " " + entry);
            }
        }
    }
    
    static class HighScoreEntry implements Comparable<HighScoreEntry>{
        String name;
        int score;
        
        public HighScoreEntry(String name, int score){
            this.name = name;
            this.score = score;
        }
        
        public String toString() {
            return name + " " + score;
        }

        public int compareTo(HighScoreEntry o) {
            return o.score - this.score ; // best score on top...
        }
    }

}
```

Die highscores.txt:

```
Thomas 10000
Chris 5000
Player1 500
Stefan 300
Player2 100
Fritz 50
Heino 10
```

Ausgabe:

```
1 Thomas 10000
2 Chris 5000
3 Player1 500
4 Stefan 300
5 Player2 100
6 Fritz 50
7 Heino 10
```

Eine andere Moeglichkeit dies zu realisieren waere die ueber ein RandomAccessFile zu gehen... aber das macht nicht wirklich Spass und der Mehraufwand wuerde sich IMHO erst bei "richtig" grossen Dateien lohnen...

Gruss Tom


----------



## huhunde (6. Juni 2006)

hm schaut ja realtiv kompliziert aus.. *g*

Gibts da keine leichtere Möglichkeit ? - mittels HashSet oder so..ich will das ganze ja dann Sortiert in einem Frame ausgeben - Highscore eben !


----------

