ich befasse mich gerade mit einer HighScore Liste für mein Spiel! Bisher funktioniert es ziemlich gut, außer dass beim Schreiben neuer Einträge die komplette Liste erst gelöscht wird und dann der neue Eintrag eingetragen wird.
Ich möchte aber gerne die Datei auslesen und dann einfach "hinzufügen" können, sodass die Liste immer länger wird.
Ist das möglich? Hier die "hinzufügen"-Funktion:
Code:
public static void saveScore(final float score, final String player){
try {
out = new FileOutputStream("highscore.txt");
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
p.put(player, String.valueOf(score));
try {
p.store(out, "");
} catch (IOException ex) {
ex.printStackTrace();
}
}
ich sag dir mal was, du könntest mit folgender methode:
Java:
staticpublicStringgetContents(File aFile){StringBuilder contents =newStringBuilder();try{BufferedReader input =newBufferedReader(newFileReader(aFile));try{String line =null;while(( line = input.readLine())!=null){
contents.append(line);}}finally{
input.close();}}catch(IOException ex){
ex.printStackTrace();}return contents.toString();}
den inhalt deiner datei aus´einem File laden, ihn in eine TextArea geben,
wenn du dann was hinzufügen willst, dann mit textarea.append("");
Java:
JTextArea area =newJTextArea();String inhalt =getContents(newFile("C:/Ergebnisse.txt"));//du musst den pfad selbst angeben
area.setText(inhalt);
area.append("neuestes Ergebnis 1:0");
und dann ganz bequem mit dieser methode:
Java:
staticpublicvoidsetContents(File aFile,String aContents)throwsFileNotFoundException,IOException{if(aFile ==null){thrownewIllegalArgumentException("File should not be null.");}if(!aFile.exists()){thrownewFileNotFoundException("File does not exist: "+ aFile);}if(!aFile.isFile()){thrownewIllegalArgumentException("Should not be a directory: "+ aFile);}if(!aFile.canWrite()){thrownewIllegalArgumentException("File cannot be written: "+ aFile);}Writer output =newBufferedWriter(newFileWriter(aFile));try{
output.write( aContents );}finally{
output.close();}}
den inhalt der datei überschreiben, und zwar mit dem was im textfield ist,
also:
publicclassErgebnissApp{publicstaticvoidmain(String[]args){JTextArea area =newJTextArea();String inhalt =getContents(newFile("C:/Ergebnisse.txt"));//du musst den pfad selbst angeben
area.setText(inhalt);
area.append("neuestes Ergebnis 1:0");//hier musst du in die Java klasse was neues eintragen//geht auch indem du diese App erweiterst, mit einem JFrame und buttons usw...setContents(newFile("C:/Ergebnisse.txt"),area.getText());}staticpublicvoidsetContents(File aFile,String aContents)throwsFileNotFoundException,IOException{if(aFile ==null){thrownewIllegalArgumentException("File should not be null.");}if(!aFile.exists()){thrownewFileNotFoundException("File does not exist: "+ aFile);}if(!aFile.isFile()){thrownewIllegalArgumentException("Should not be a directory: "+ aFile);}if(!aFile.canWrite()){thrownewIllegalArgumentException("File cannot be written: "+ aFile);}Writer output =newBufferedWriter(newFileWriter(aFile));try{
output.write( aContents );}finally{
output.close();}}staticpublicStringgetContents(File aFile){StringBuilder contents =newStringBuilder();try{BufferedReader input =newBufferedReader(newFileReader(aFile));try{String line =null;while(( line = input.readLine())!=null){
contents.append(line);}}finally{
input.close();}}catch(IOException ex){
ex.printStackTrace();}return contents.toString();}}
Ja einfacher auf jeden Fall! Nur finde ich es immer ziemlich hilfreich, wenn man mehrere Lösungen hat und dann auch abwägen kann, welche für einen persönlich am Besten ist
Da hier immer sehr hilfreich geantwortet wird habe ich noch eine Frage ;-)
Ich hab das nun mit FileOutputStream("highscore.txt", true); gemacht....
Wenn ich jetzt bei meinem Spiel in das Ziel komme, dann speichert er die Daten in die Textdatei, allerdings sieht man diese erst beim nächsten Start. Es fehlt also ein refresh der List, bevor sie benutzt wird!!!
dein Code enthält nichts, was auf eine List oder sonstige Ausgabe wie andeutet ("sieht man diese erst beim nächsten Start. Es fehlt also ein refresh der List") schließen lässt
die playerMap oder das array könntest du ersetzen, wo ist denn aktuell die Schwierigkeit?
vielleicht auch komplett initHighScore(); neu aufrufen