Tutorial: Dateien lesen & schreiben
Inhaltsverzeichnis
Ziel des Tutorials
Nach diesem Tutorial kannst du:
String
- undint
-Arrays in Dateien speichern.String
- undint
-Arrays aus Dateien wieder einlesen.- Dateien in beliebigen (und beliebig tiefen) Ordnern deines Projekts ansteuern.
- Dein Spiel-Projekt so exportieren, dass alle Verzeichnisanfragen in deiner ausführbaren .jar - Datei noch funktionieren.
Das .eaa - Format
Die meisten Informationen bei einem Spiel werden nicht wieder gebraucht, nachdem das Spiel beendet wird. Bei einem einfachen Spiel ist dies vor allem der ganze Spielaufbau. Dieser wird bei jedem Start von neuem erledigt. Das wird also nicht extra gespeichert.
Ausnahmen sind zum Beispiel Spielstände, Highscores oder Verlaufslisten. Dies sind Dinge, die beim nächsten Spielstart nicht unbedingt wieder genau so sein sollen wie beim letzten. Deshalb werden diese Informationen in der Regel für den nächsten Spielstart gespeichert. Es wäre z.B. schade, wenn der Highscore mit der virtuellen Maschine von Java beim Schließen des Spiels untergeht.
Daher kann man mit der Engine Alpha Dateien speichern und laden. Derzeit ist der direkte Support der Engine beschränkt auf Arrays der folgenden Datentypen:
int
-ArraysString
-Arrays
Diese Daten werden in einem eigenen Dateiformat der Engine Alpha gespeichert, nämlich dem .eaa-Format.
Erfahrungsgemäß reichen diese Datentypen für die meisten Anwendungen. Falls du für dein Projekt mit der Beschränkung dieses Formats an die Grenzen des möglichen stößt, gib uns gerne entsprechendes Feedback.
Die Klasse DateiManager
Alle Operationen, die das direkte Ein- und Auslesen von Dateien realisieren, sind über eine Klasse erreichbar. Das ist die Klasse DateiManager
. Die Klasse DateiManager
besitzt für alle nötigen Operationen statische Methoden. Das heißt diese Methoden führt man nicht über ein Objekt der Klasse DateiManager
aus,
sondern über die Klasse selbst.
Du kennst vielleicht schon die statische Methode:
System.out.println("Hi, das schicke ich direkt an die Konsole!");
Genau so funktionieren die Methodenaufrufe bei der Klasse DateiManager
. Aber auch hierzu wird es viele Beispielcodes geben.
Dateien schreiben
Für das Schreiben eines int
-Arrays (anders gesagt: eines int[]
-Objektes) gibt es die Methode:
public static void integerArraySchreiben(int[] array, String dateiname)
Der Dateityp ist immer .eaa! Das ist ein spezielles Dateiformat für Arrays. Also endet der dateiname
stets mit ".eaa"
.
Hierfür ein kleines Beispiel:
/**
* Diese Methode schreibt ein Integer-Array und fuellt es mit den
* Quadratzahlen.
* Anschließend wird das Array als Datei gespeichert.
*/
public void quadratzahlenSchreiben() {
int[] quadr = new int[10];
for(int i = 0; i < quadr.length; i++) {
quadr[i] = i*i;
}
//Durch den Aufruf dieser Methode wird das Array als Datei gespeichert
DateiManager.integerArraySchreiben(quadr, "Quadratzahlendatei.eaa");
}
Dateien wieder einlesen
Anschließend lässt sich die Datei natürlich auch wieder einlesen, und zwar folgendermaßen:
public static int[] integerArrayEinlesen(String dateiname)
Somit lassen sich die Quadratzahlen folgendermaßen einlesen:
/**
* Diese Methode ließt die geschriebene Datei wieder ein.
* Anschließend wird sie die einzelnen Zahlen an der Konsole ausgeben.
*/
public void quadratzahlenEinlesen() {
//Die folgende Methode liesst das Array wieder ein und gibt es zurueck
int[] quadr = DateiManager.integerArrayEinlesen("Quadratzahlendatei.eaa");
for(int i = 0; i < quadr.length; i++) {
System.out.println(quadr[i]);
}
}
Mit String
-Arrays funktioniert das Ein- und Auslesen genauso. Die entsprechenden Methoden hierfür lauten:
public static void stringArraySchreiben(String[] array, String dateiname)
public static String[] stringArrayEinlesen(String dateiname)
Arbeiten mit Verzeichnissen
Bei einem größerem Spiel, für das viele Dateien geladen werden müssen (zum Beispiel Tutorials/Figuren), ist es vielleicht sinnvoll, in mehreren Ordnern alle Dateien systematisch zu ordnen, um Übersicht zu schaffen.
Das ist mit der Engine (seit Version 3.0) problemlos möglich. Vom ursprünglichen Projektordner aus kann man einen beliebigen Ordnerpfad durch /
-Trennzeichen im Verzeichnis-String
beschreiben, zum Beispiel:
String verzeichnis = "dieser/Pfad/funktioniert/auf/jedem/Betriebssystem.eaa";
Laden und Speichern bei einem exportierten Projekt (.jar-Datei)
Ist das Spiel fertig und wird als .jar-Datei exportiert, muss folgendes beachtet werden:
Alle zu ladenden Dateien müssen im selben Ordner, wie die ausführbare .jar-Datei abgelegt werden, damit sie standardmäßig geladen werden können. Während des Exportes sollten die Dateien dann nicht im Porjektordner enthalten sein. Das spart Speicherplatz.
Das hieße für das obige Beispiel, dass der Ordner "dieser" im selben Verzeichnis liegenmüsste, in dem die ausführbare .jar-Datei liegt.
Details zum Export deines Projektes findest du im Tutorial Projektexport.
Probleme?
Du kannst ein einfaches Beispielprojekt, das ein Array erstellen und speichern bzw. einlesen kann, herunterladen, testen und einsehen.