Abgabe: 25.1.2007
Implementiert ein einfaches, UNIX-ähnliches Dateisystem in Java, gemäß der vorgegebenen Spezifikation (Download). Verwendet für das Dateisystem ein Block-Gerät-Abbild (analog zu Bochs, QEmu & co.). Die vorgegebene Klasse BlockDevice stellt dazu die grundlegenden Funktionen bereit, um eine Abbild-Datei mit gewünschter Blockgröße und -anzahl zu öffnen bzw. anzulegen, sowie um die Blöcke zu lesen und zu schreiben. Blöcke werden dabei als Byte-Felder (byte[]) fester Größe repräsentiert. Weitere Klassen der Vorgabe stellen die Systemschnittstelle zum Dateisystem für Benutzerprogramme dar (File, Directory, SequentialFile, Channel, Attributes). Die Klasse Shell verwendet diese Schnittstelle und kann zu Testzwecken verwendet werden.
Entwerft zuerst eine geeignete Abbildung von Dateien und Verzeichnissen auf das Block-Gerät sowie die erforderlichen Verwaltungsdaten für das Gerät selbst. Für sequentielle Dateien soll gestreute Speicherung praktiziert werden; weitere Anforderungen ergeben sich aus der vorgegebenen Spezifikation. Dokumentiert Euren Entwurf und begründet die Entwurfs-Entscheidungen, die Ihr dabei getroffen habt.
Implementiert die Geräteverwaltung in der Klasse Disk, sowie die Abbildung von Verzeichnissen und die zugehörige Systemschnittstelle in der Klasse Directory. Dazu muss auch allgemeine Funktionalität in der Basisklasse File bereitgestellt werden. Für die Ablage von bestimmten Datentypen (byte, int, long, String) in einem Block könnt Ihr die vorgegebene Hilfsklasse IO verwenden.
Der Aufruf eines Directory-Konstruktors soll ein ein neues Verzeichnis unter dem übergebenen Pfad anlegen. Pfad-Parameter können sowohl absolut (z.B. /home/mydir/mynewdir) als auch relativ zum aktuellen Arbeitsverzeichnis (z.B. mydir/mynewdir) angegeben werden. Darüber hinaus darf ein Pfad auch "." und ".." als Komponenten enthalten.
Testet das Anlegen, Auflisten und Löschen von Verzeichnissen mit der vorgegebenen Shell.
Implementiert die Abbildung von sequentiellen Dateien und die zugehörige Systemschnittstelle in der Klasse SequentialFile. Wie auch bei Verzeichnissen soll der Aufruf eines Konstruktors eine neue sequentielle Datei unter dem übergebenen Pfad anlegen. Realisiert ferner den Zugriff auf Dateien durch die Schnittstelle Channel in geeigneter Weise.
Sequentielle Dateien sollen ihre Daten in mehreren Blöcken speichern, welche beliebig über das Block-Gerät verteilt sein können. Es dürfen ferner auch "Löcher" in der sequentiellen Datei auftreten, also Bereiche in der Datei, in die bisher keiner Daten geschrieben wurden. Aus Effizienzgründen werden für solche Löcher keine Blöcke belegt. Beim sequentiellen Lesen werden fehlende Blöcke durch eine entsprechende Anzahl von Null-Bytes repräsentiert. Erst wenn an eine Loch-Position geschrieben wird, muss ein neuer Block dafür belegt werden. Die Blöcke müssen außerdem wieder freigegeben werden, wenn die verwendende Datei nicht mehr zugreifbar ist.
Testet das Anlegen, Auslesen und Löschen von sequentiellen Dateien mit der vorgegebenen Shell.
Einige Methoden der vorgegebenen Systemschnittstelle sind als "(optional)" gekennzeichnet. Diese sind für die Implementierung des Dateisystems nicht unbedingt erforderlich, stellen aber interessante Erweiterungen der Funktionalität dar. Dies sind der beliebige Zugriff auf Datei-Inhalte (Channel.seek()), die Erstellung von Datei-Aliases (SequentialFile.link()), sowie die Einbindung weiterer Dateisysteme in den Verzeichnisbaum (Directory.mount()). Wer Interesse hat, kann diese Methoden ebenfalls implementieren. Wenn Ihr das vorhabt, beachtet die Implikationen bei der Implementierung der Systemschnittstelle und ggf. sogar beim Entwurf der Datei-Abbildung.