Java voorziet in een erg eenvoudige, en relatief gelimeteerde, manier om jouw data op te slaan in een bestand. Dit kan eenvoudig door de Serializable
interface te implementeren.
public class Person implements Serializable {
private final String firstName, initials, lastName;
// ...
}
Deze eenvoudige toevoeging aan je klasse definitie maakt het mogelijk om opgeslagen te worden in een ObjectOutputStream
.
Belangrijk punt: Alle member variabelen en hun typen moeten nu ook Serializable
implementeren om dit te laten werken.
Om wat gegevens te hebben om op te slaan gebruiken we weer het volgende model als voorbeeld. Het is dezelfde structuur die we ook als voorbeeld gebruiken bij OGP.
Zoals boven aangetoond implementeert de Person
klasse de Serializable
interface. (Stap 1)
Aangezien alle member variabelen basis Java types (String en int) gebruiken kan deze klasse geexporteerd worden door deze simpele wijziging.
Jouw model kan nu opgeslagen worden in een bestand door gebruik te maken van een ObjectOutputStream
.
// Create some data.
Student s = new Student("Mark", "M.", "Hamill", 12345);
Teacher t = new Teacher("Frederik", "F.", "Bonte", "fbo11", "ing.");
// Create an Object Output Stream.
String filename = "resources/objects.obj";
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fos);
// Write some data...
oos.writeObject(t);
oos.writeObject(s);
// Close the stream (and the containing file).
oos.close();
Nu bevat de “objects.obj” file een hoeveelheid binaire data. Voel je vrij om dit bestand te analyseren. Maar het basis idee is dat beide objecten opgeslagen zijn in dit bestand.
Dit bestand is gegenereerd met deze versie van jouw code. Iedere verandering in een opgeslagen klasse, zoals het toevoegen een een optioneel veld bijvoorbeeld, maakt dit bestand onleesbaar.
Ju kunt alleen bestanden lezen die gemaakt zijn met deze versie van de objecten. Iedere wijziging breekt dit bestand.
Het bestand is opgeslagen in een binair formaat en kan eigenlijk niet gewijzigd worden.
Objecten worden opgeslagen in een specifieke volgorde. Uitlezen vereist dezelfde volgorde.
Aangezien je met ObjectOutputStream
data kunt opslaan, is het logisch dat je met ObjectInputStream
deze data weer kunt lezen.
// Create an Object Input Stream.
String filename = "resources/objects.obj";
FileInputStream fis = new FileInputStream(filename);
ObjectInputStream ois = new ObjectInputStream(fis);
// Read objects in the SAME order.
Teacher other_t = (Teacher)ois.readObject();
Student other_s = (Student)ois.readObject();
// Close the stream (and the containing file).
ois.close();
// Show that reading succeeded.
System.out.println(other_s);
System.out.println(other_t);
Dingen om uit te proberen:
ArrayList
van Person
en opslaan? En lezen?Student
en en Teacher
s toevoegen aan die lijst?Teacher
een lijst van Student
en bijhoudt?