From 57d75caac405d189fb060126c146b69ad36ee382 Mon Sep 17 00:00:00 2001 From: Thomas Smits Date: Sun, 15 Sep 2024 15:49:50 +0200 Subject: [PATCH] Update of exercises --- Abstrakte_Klassen_001/readme.md | 28 ++++++++++ Abstrakte_Klassen_002/readme.md | 31 +++++++++++ Einfuehrung_001/readme.md | 28 ++++++++++ Einfuehrung_002/readme.md | 26 +++++++++ Einfuehrung_003/readme.md | 26 +++++++++ Generische_Typen_001/readme.md | 32 +++++++++++ Generische_Typen_002/readme.md | 28 ++++++++++ Generische_Typen_003/readme.md | 28 ++++++++++ Generische_Typen_004/readme.md | 28 ++++++++++ Generische_Typen_005/readme.md | 28 ++++++++++ Generische_Typen_006/readme.md | 26 +++++++++ Generische_Typen_007/readme.md | 30 ++++++++++ Generische_Typen_008/readme.md | 35 ++++++++++++ Generische_Typen_009/readme.md | 49 +++++++++++++++++ Geschachtelte_Klassen_001/readme.md | 28 ++++++++++ Geschachtelte_Klassen_002/readme.md | 30 ++++++++++ Geschachtelte_Klassen_003/readme.md | 30 ++++++++++ Input_und_Output_001/kafka.txt | 11 ++++ Input_und_Output_001/readme.md | 39 +++++++++++++ Input_und_Output_002/readme.md | 38 +++++++++++++ Input_und_Output_003/readme.md | 28 ++++++++++ Input_und_Output_004/readme.md | 53 ++++++++++++++++++ Input_und_Output_005/daten.dat | Bin 0 -> 10 bytes Input_und_Output_005/readme.md | 34 ++++++++++++ Input_und_Output_006/readme.md | 36 ++++++++++++ Input_und_Output_007/readme.md | 47 ++++++++++++++++ Input_und_Output_008/readme.md | 42 ++++++++++++++ Input_und_Output_009/readme.md | 28 ++++++++++ Input_und_Output_010/readme.md | 30 ++++++++++ Input_und_Output_011/readme.md | 31 +++++++++++ Input_und_Output_012/data.dat | Bin 0 -> 100 bytes Input_und_Output_012/readme.md | 32 +++++++++++ Input_und_Output_013/kafka.txt | 11 ++++ Input_und_Output_013/readme.md | 26 +++++++++ Input_und_Output_014/readme.md | 36 ++++++++++++ Input_und_Output_015/readme.md | 39 +++++++++++++ Input_und_Output_016/readme.md | 34 ++++++++++++ Input_und_Output_016/testdata.dat | Bin 0 -> 443 bytes Object_und_Wrapper_001/readme.md | 26 +++++++++ Object_und_Wrapper_002/readme.md | 26 +++++++++ Object_und_Wrapper_003/readme.md | 32 +++++++++++ Object_und_Wrapper_004/readme.md | 26 +++++++++ Object_und_Wrapper_005/readme.md | 38 +++++++++++++ Object_und_Wrapper_006/readme.md | 28 ++++++++++ Object_und_Wrapper_007/readme.md | 39 +++++++++++++ readme.md | 82 ++++++++++++++-------------- 46 files changed, 1362 insertions(+), 41 deletions(-) create mode 100644 Abstrakte_Klassen_001/readme.md create mode 100644 Abstrakte_Klassen_002/readme.md create mode 100644 Einfuehrung_001/readme.md create mode 100644 Einfuehrung_002/readme.md create mode 100644 Einfuehrung_003/readme.md create mode 100644 Generische_Typen_001/readme.md create mode 100644 Generische_Typen_002/readme.md create mode 100644 Generische_Typen_003/readme.md create mode 100644 Generische_Typen_004/readme.md create mode 100644 Generische_Typen_005/readme.md create mode 100644 Generische_Typen_006/readme.md create mode 100644 Generische_Typen_007/readme.md create mode 100644 Generische_Typen_008/readme.md create mode 100644 Generische_Typen_009/readme.md create mode 100644 Geschachtelte_Klassen_001/readme.md create mode 100644 Geschachtelte_Klassen_002/readme.md create mode 100644 Geschachtelte_Klassen_003/readme.md create mode 100644 Input_und_Output_001/kafka.txt create mode 100644 Input_und_Output_001/readme.md create mode 100644 Input_und_Output_002/readme.md create mode 100644 Input_und_Output_003/readme.md create mode 100644 Input_und_Output_004/readme.md create mode 100644 Input_und_Output_005/daten.dat create mode 100644 Input_und_Output_005/readme.md create mode 100644 Input_und_Output_006/readme.md create mode 100644 Input_und_Output_007/readme.md create mode 100644 Input_und_Output_008/readme.md create mode 100644 Input_und_Output_009/readme.md create mode 100644 Input_und_Output_010/readme.md create mode 100644 Input_und_Output_011/readme.md create mode 100644 Input_und_Output_012/data.dat create mode 100644 Input_und_Output_012/readme.md create mode 100644 Input_und_Output_013/kafka.txt create mode 100644 Input_und_Output_013/readme.md create mode 100644 Input_und_Output_014/readme.md create mode 100644 Input_und_Output_015/readme.md create mode 100644 Input_und_Output_016/readme.md create mode 100644 Input_und_Output_016/testdata.dat create mode 100644 Object_und_Wrapper_001/readme.md create mode 100644 Object_und_Wrapper_002/readme.md create mode 100644 Object_und_Wrapper_003/readme.md create mode 100644 Object_und_Wrapper_004/readme.md create mode 100644 Object_und_Wrapper_005/readme.md create mode 100644 Object_und_Wrapper_006/readme.md create mode 100644 Object_und_Wrapper_007/readme.md diff --git a/Abstrakte_Klassen_001/readme.md b/Abstrakte_Klassen_001/readme.md new file mode 100644 index 0000000..5473313 --- /dev/null +++ b/Abstrakte_Klassen_001/readme.md @@ -0,0 +1,28 @@ +# Abstrakte Klassen +## Lernziel + + + +Eine abstrakte Klasse einsetzen, um eine einheitliche Schnittstelle für unterschiedliche Klassen anzubieten. + +## Aufgabe + +Im Paket [pr2.interfaces.abstrakte_klassen_e](../sources/src/main/java/pr2/interfaces/abstrakte_klassen_e/) finden Sie Klassen, welche geometrische Figuren repräsentieren. + +Betrachten Sie die vorhandenen Klassen `Dreieck`, `Kreis` und `Geometer` und finden Sie Gemeinsamkeiten und Unterschiede. Lassen Sie das Programm laufen und notieren Sie sich die Ausgabe. + +Führen Sie eine neue _abstrakte_ Klasse `Figur` ein und vereinfachen Sie mit dieser Klasse das vorhandene Programm. Lassen Sie das Programm erneut laufen und vergleichen Sie die Ausgabe mit der vorher notierten. + + + \ No newline at end of file diff --git a/Abstrakte_Klassen_002/readme.md b/Abstrakte_Klassen_002/readme.md new file mode 100644 index 0000000..1e421cf --- /dev/null +++ b/Abstrakte_Klassen_002/readme.md @@ -0,0 +1,31 @@ +# Abstrakte Klasse +## Lernziel + + + +Abstrakte Klasse verwenden. + +## Aufgabe + +Gehen Sie in das Paket [pr2.interfaces.abstrakt_form](../sources/src/main/java/pr2/interfaces/abstrakt_form/). + +Schreiben Sie bitte eine abstrakte Klasse `Form` mit den folgenden abstrakten Methoden: + + * `flaeche()` liefert die Fläche der Form als Gleitkommazahl mit doppelter Genauigkeit zurück + * `umfang()` liefert den Umfang der Form als Gleitkommazahl mit doppelter Genauigkeit zurück + +Fügen Sie außerdem noch zwei Attribute für die x- und y-Position der Form hinzu und schreiben Sie einen entsprechenden Konstruktor. Wählen Sie die Sichtbarkeiten der Attribute so, dass Subklassen sie lesen und schreiben können. + + + \ No newline at end of file diff --git a/Einfuehrung_001/readme.md b/Einfuehrung_001/readme.md new file mode 100644 index 0000000..28b225e --- /dev/null +++ b/Einfuehrung_001/readme.md @@ -0,0 +1,28 @@ +# Java-Coding-Standard anwenden +## Lernziel + + + +Java-Code korrekt entsprechend dem [Coding-Standard von Oracle](http://www.oracle.com/technetwork/java/codeconventions-150003.pdf) formatieren. + +## Aufgabe + +Im Paket [pr2.intro.coding_standard](../sources/src/main/java/pr2/intro/coding_standard/) finden Sie eine Klasse `CodingStandard`. Compilieren Sie die Datei `CodingStandard.java` und stellen Sie so sicher, dass es sich um eine syntaktisch korrekte Java-Klasse handelt. + +Formatieren Sie `CodingStandard` so um, dass sie dem in der Vorlesung vorgestellten Coding-Standard entspricht. + +Prüfen Sie, ob sich die Klasse noch korrekt compilieren lässt, bevor sie fortfahren. + + + \ No newline at end of file diff --git a/Einfuehrung_002/readme.md b/Einfuehrung_002/readme.md new file mode 100644 index 0000000..c2907be --- /dev/null +++ b/Einfuehrung_002/readme.md @@ -0,0 +1,26 @@ +# JavaDoc schreiben +## Lernziel + + + +Eine vorhandene Klasse mit korrekten JavaDoc-Kommentaren versehen. + +## Aufgabe + +Im Paket [pr2.intro.javadoc](../sources/src/main/java/pr2/intro/javadoc/) finden Sie eine Klasse namens `Waehrung`, die eine Währung repräsentiert. Leider hat ein böser Geist bei dieser Klasse fast die gesamte JavaDoc gelöscht. + +Schreiben Sie eine sinnvolle JavaDoc für die Klasse `Waehrung`, die insbesondere die Funktion der Methoden und deren Parameter und Rückgabewerte erläutert. Vergessen Sie nicht, auch die Klasse selbst zu dokumentieren. + + + \ No newline at end of file diff --git a/Einfuehrung_003/readme.md b/Einfuehrung_003/readme.md new file mode 100644 index 0000000..3e208b9 --- /dev/null +++ b/Einfuehrung_003/readme.md @@ -0,0 +1,26 @@ +# Klasse mit JUnit testen +## Lernziel + + + +Einen JUnit-Test für eine gegebene Klasse schreiben. + +## Aufgabe + +Gehen Sie in das Paket [pr2.intro.junit_faculty](../sources/src/main/java/pr2/intro/junit_faculty/). + +Schreiben Sie bitte einen JUnit-Test für folgende Klasse `Fakultaet`, der die Funktionalität der Methode `fact` testet. Denken Sie insbesondere daran, die Randfälle zu testen. + + + \ No newline at end of file diff --git a/Generische_Typen_001/readme.md b/Generische_Typen_001/readme.md new file mode 100644 index 0000000..73d89a5 --- /dev/null +++ b/Generische_Typen_001/readme.md @@ -0,0 +1,32 @@ +# Einen generischen Typ schreiben +## Lernziel + + + +Einen vorhandenen Typ so umgestalten, dass er als generischer Typ verwendet werden kann. + +## Aufgabe + +Gehen Sie in das Paket [pr2.generics.einfach](../sources/src/main/java/pr2/generics/einfach/). + +Sie finden mit `Liste` eine sehr simple Implementierung einer einfach verketteten Liste vor. Zusätzlich gib es auch noch Tests, die die Liste testen. + +Führen Sie die Tests aus und überzeugen Sie sich, dass die Liste korrekt funktioniert. + +Schreiben Sie die Klasse `Liste` so um, dass sie zu einem generischen Typ wird. Dies bedeutet insbesondere, dass die Methoden `get` und `add` nicht mehr mit `Object` arbeiten, sondern typsicher werden. Sie dürfen in Ihrer Lösung __keine Casts__ verwenden, d.h. Sie müssen sich auch mit der Klasse `ListNode` beschäftigen und hier Änderungen vornehmen. + +Führen Sie die Tests erneut aus, um sicherzugehen, dass Sie bei Ihren Änderungen nichts kaputt gemacht haben. + + + \ No newline at end of file diff --git a/Generische_Typen_002/readme.md b/Generische_Typen_002/readme.md new file mode 100644 index 0000000..79da9ec --- /dev/null +++ b/Generische_Typen_002/readme.md @@ -0,0 +1,28 @@ +# Generische Klasse Pair schreiben +## Lernziel + + + +Von einem generischen Typ erben. + +## Aufgabe + +Gehen Sie in das Paket [pr2.generics.pair](../sources/src/main/java/pr2/generics/pair/). + +Schreiben Sie eine generische Klasse `Pair`, die zwei Objekte unterschiedlichen Typs verwalten kann. Die Instanzen von `Pair` sollen unveränderlich (**immutable**) sein. + +Testen Sie Ihre Implementierung mit der vorhandenen `Main`-Klasse. + + + \ No newline at end of file diff --git a/Generische_Typen_003/readme.md b/Generische_Typen_003/readme.md new file mode 100644 index 0000000..682e5e1 --- /dev/null +++ b/Generische_Typen_003/readme.md @@ -0,0 +1,28 @@ +# Generische Klasse Pair erweitern: NumberPair +## Lernziel + + + +Von einem generischen Typ erben. + +## Aufgabe + +Gehen Sie in das Paket [pr2.generics.number_pair](../sources/src/main/java/pr2/generics/number_pair/). + +Schreiben Sie eine generische Klasse `NumberPair`, die von der Klasse `Pair` aus der vorhergehenden Aufgabe abgeleitet ist und erzwingt, dass beide verwaltete Objekte von `Number` oder einer Subklasse von `Number` (`Double`, `Integer`, `Long` etc.) sind. + +Testen Sie Ihre Implementierung mit der vorhandenen `Main`-Klasse. + + + \ No newline at end of file diff --git a/Generische_Typen_004/readme.md b/Generische_Typen_004/readme.md new file mode 100644 index 0000000..4ae6226 --- /dev/null +++ b/Generische_Typen_004/readme.md @@ -0,0 +1,28 @@ +# Generische Klasse Pair erweitern: SamePair +## Lernziel + + + +Von einem generischen Typ erben. + +## Aufgabe + +Gehen Sie in das Paket [pr2.generics.same_pair](../sources/src/main/java/pr2/generics/same_pair/). + +Schreiben Sie eine generische Klasse `SamePair`, die von der Klasse `Pair` aus der vorhergehenden Aufgabe abgeleitet ist und erzwingt, dass beide verwaltete Objekte vom selben Typ sind. + +Testen Sie Ihre Implementierung mit der vorhandenen `Main`-Klasse. + + + \ No newline at end of file diff --git a/Generische_Typen_005/readme.md b/Generische_Typen_005/readme.md new file mode 100644 index 0000000..55a9b8f --- /dev/null +++ b/Generische_Typen_005/readme.md @@ -0,0 +1,28 @@ +# PairList +## Lernziel + + + +Sammlungen von Objekten eines generischen Typs erstellen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.generics.pairlist](../sources/src/main/java/pr2/generics/pairlist/). + +Schreiben Sie eine generische Klasse `PairList`, die eine beliebige Anzahl von `Pair`-Objekten verwalten kann. Die Anzahl der maximal gespeicherten Objekte wird beim Erzeugen mitgegeben. Die Klasse erlaubt das Hinzufügen (`add`) und das Auslesen von Objekten anhand des Indexes (`get`). + +Testen Sie Ihre Implementierung mit der vorhandenen `Main`-Klasse. + + + \ No newline at end of file diff --git a/Generische_Typen_006/readme.md b/Generische_Typen_006/readme.md new file mode 100644 index 0000000..4cbb3db --- /dev/null +++ b/Generische_Typen_006/readme.md @@ -0,0 +1,26 @@ +# Wildcard benutzen +## Lernziel + + + +Wildcards einsetzen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.generics.printer](../sources/src/main/java/pr2/generics/printer/). + +Schreiben Sie eine Klasse `CollectionPrinter` mit einer statischen Methode `print`, der man eine beliebige (generische) Collection übergeben kann und die dann deren Inhalt ausdruckt. Eine _Collection_ ist eine Klasse, die beliebig viele Objekte verwalten kann und über die man mit der _for each_-Schleife iterieren kann. + + + \ No newline at end of file diff --git a/Generische_Typen_007/readme.md b/Generische_Typen_007/readme.md new file mode 100644 index 0000000..d14fccf --- /dev/null +++ b/Generische_Typen_007/readme.md @@ -0,0 +1,30 @@ +# Generische Queue +## Lernziel + + + +Einen komplexeren generischen Typ entwickeln. + +## Aufgabe + +Gehen Sie in das Paket [pr2.generics.queue](../sources/src/main/java/pr2/generics/queue/). + +Schreiben Sie eine generische Klasse `Queue`, die eine einfache Warteschlange (Queue) realisiert. Über die Methode `offer` können Objekte hinzugefügt werden, über `poll` wieder ausgelesen. Über Probleme des Over- und Underflows brauchen Sie sich hier keine Gedanken zu machen. + +Erweitern Sie die Klasse `Queue` um eine Methode `addAll`, der man eine andere `Queue` übergibt und die dann alle Elemente der übergebenen Queue in die aktuelle übernimmt. + +Erweitern Sie die Klasse `Queue` aus der vorhergehenden Aufgabe um eine Methode `copyInto`, der man eine andere `Queue` übergibt und die dann alle Elemente der aktuellen Queue in die übergebenen kopiert. + + + \ No newline at end of file diff --git a/Generische_Typen_008/readme.md b/Generische_Typen_008/readme.md new file mode 100644 index 0000000..89d585d --- /dev/null +++ b/Generische_Typen_008/readme.md @@ -0,0 +1,35 @@ +# `super` und `extends` einsetzen +## Lernziel + + + +Methoden unter Verwendung von `super` und `extends` gestalten, sodass sie flexibel auch mit Sub- bzw. Supertypen umgehen können. + +## Aufgabe + +Gehen Sie in das Paket [pr2.generics.super_extends](../sources/src/main/java/pr2/generics/super_extends/). + +In dieser Aufgabe sollen Sie die Klasse `Liste` erweitern. + +Fügen Sie `Liste` zwei Methoden hinzu: + + * `fillFrom`: befüllt die Liste mit den Daten aus einer anderen (übergebene) Liste. + * `copyInto`: kopiert die Daten der Liste in eine andere (übergebene) Liste. + +Verwenden Sie für Ihre Lösung `super` und `extends` zusammen mit Wildcards (`?`). + +Kommentieren Sie die Testmethode in den vorhandenen Tests ein und führen Sie diese danach aus. Versichern Sie sich, dass Ihre Implementierung korrekt funktioniert, bevor Sie die Lösung abgeben. + + + \ No newline at end of file diff --git a/Generische_Typen_009/readme.md b/Generische_Typen_009/readme.md new file mode 100644 index 0000000..d936508 --- /dev/null +++ b/Generische_Typen_009/readme.md @@ -0,0 +1,49 @@ +# Generische Typen zusammen mit Wildcards einsetzen +## Lernziel + + + +Gebundene und ungebundene Wildcards einsetzen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.generics.wildcards](../sources/src/main/java/pr2/generics/wildcards/). + +In dieser Aufgabe finden Sie bereits eine Implementierung einer generischen, auf Arrays basierenden Liste namens `SimpleList` vor. An dieser müssen Sie nichts verändern, sondern verwenden die Klasse wie sie ist. + +Schreiben Sie nun eine _nicht generische_ Klasse `ListHelper`, die zwei statische Methoden enthält: + + * `printList`: Diese Methode bekommt eine beliebige `SimpleList` übergeben und druckt deren Inhalt einfach auf der Konsole aus. Deswegen hat die Methode auch den Rückgabetyp `void`. + * `sumList`: Diese Methode nimmt als Parameter `SimpleList`-Objekte, die irgendeine Form von Zahlen enthalten (`Number` oder Subklassen davon) und berechnet deren Summe. Das Ergebnis wird als `double`-Wert zurückgegeben. + +Verwenden Sie für die Methoden gebundene bzw. ungebundene Wildcards. + +Kommentieren Sie die entsprechenden Zeilen in der Klasse `Main` aus und sehen überprüfen Sie, ob Ihre Implementierungen auch wie gewünscht funktionieren. Die Ausgabe sollte sein: + +```console +Dies +ist +ein +Test +. +1 +2 +3 +4 +5 +15.0 +``` + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen_001/readme.md b/Geschachtelte_Klassen_001/readme.md new file mode 100644 index 0000000..35d8843 --- /dev/null +++ b/Geschachtelte_Klassen_001/readme.md @@ -0,0 +1,28 @@ +# MatrixSuche +## Lernziel + + + +Statische innere Klassen einsetzen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.lambda.matrixsuche](../sources/src/main/java/pr2/lambda/matrixsuche/). + +Schreiben Sie eine Klasse `MatrixSuche`, die eine statische Methode `findEntry` anbietet. Die Methode soll in einem zweidimensionalen `int`-Array nach einem gegebenen Eintrag suchen und die Position des gefundenen Eintrags in der Matrix zurückgeben. Um die Position zurückzugeben, verwenden Sie bitte eine statische innere Klasse namens `Position`, die die x- und y-Postion enthält. + +Überschreiben Sie die `toString`-Methode in `Position` und testen Sie, ob Ihre Implementierung richtig funktioniert. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen_002/readme.md b/Geschachtelte_Klassen_002/readme.md new file mode 100644 index 0000000..e6d59c4 --- /dev/null +++ b/Geschachtelte_Klassen_002/readme.md @@ -0,0 +1,30 @@ +# Innere Klasse Beobachter +## Lernziel + + + +Zugriff von inneren Klassen auf die umgebende Klasse. + +## Aufgabe + +Gehen Sie in das Paket: [pr2.lambda.observer](../sources/src/main/java/pr2/lambda/observer/). + +Dort finden Sie das Interface `Beobachter`. + +Schreiben Sie eine Klasse `Datenhalter`, die eine einziges, privates Attribut vom Typ `int` enthält. Setzen Sie das Attribut im Konstruktor, erzeugen Sie aber keinen Getter. + +Implementieren Sie das Interface `Beobachter` als nicht-statische, private innere Klasse in `Datenhalter` und erlauben Sie über den Beobachter Zugriff auf das Attribut, indem Sie ein entsprechendes Objekt vom Typ `Beobachter` zurückgeben. Testen Sie Ihre Implementierung mit einem JUnit-Test. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen_003/readme.md b/Geschachtelte_Klassen_003/readme.md new file mode 100644 index 0000000..bef6698 --- /dev/null +++ b/Geschachtelte_Klassen_003/readme.md @@ -0,0 +1,30 @@ +# Callback mit anonymer Klasse realisieren +## Lernziel + + + +Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als anonyme innere Klasse realisiert. + +## Aufgabe + +Gehen Sie in das Paket [pr2.lambda.callback](../sources/src/main/java/pr2/lambda/callback/). + +In dieser Aufgabe wird ein sehr gängiges Muster benutzt, dass auch bei großen Suchmaschinen zum Einsatz kommt. Über eine Filter-Funktion werden aus einer Menge von Daten diejenigen ausgewählt, die gewünscht sind. Die Auswahlfunktion wird von außen vorgegeben, sodass beliebige Filteroperationen möglich sind, auch solche, die beim Schreiben des Rahmenwerkes noch nicht bekannt waren. + +Sehen Sie sich das Interface `Prediacte` und die Klasse `NumberSelector` an und versuchen Sie die Funktionsweise der beiden zu verstehen. Betrachten Sie nun die Klasse `Main`, die versucht zuerst die geraden und dann die ungeraden Zahlen auszuwählen und auszugeben. Der hierfür nötige Code ist zwar schon weitgehend vorhanden, aber in der `main`-Methode müssen Sie noch zwei passende Filterfunktionen als **anonyme innere Klassen** realisieren. + +Nachdem Sie die beiden Filter geschrieben haben, lassen Sie das Programm laufen und überprüfen Sie, ob wirklich die richtigen Zahlen ausgewählt werden. + + + \ No newline at end of file diff --git a/Input_und_Output_001/kafka.txt b/Input_und_Output_001/kafka.txt new file mode 100644 index 0000000..b5695c5 --- /dev/null +++ b/Input_und_Output_001/kafka.txt @@ -0,0 +1,11 @@ +Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner + +Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh das Frühstück brachte, kam diesmal nicht. Das war noch niemals geschehen. K. wartete noch ein Weilchen, sah von seinem Kopfkissen aus die alte Frau, die ihm gegenüber wohnte und die ihn mit einer an ihr ganz ungewöhnlichen Neugierde beobachtete, dann aber, gleichzeitig befremdet und hungrig, läutete er. Sofort klopfte es und ein Mann, den er in dieser Wohnung noch niemals gesehen hatte, trat ein. Er war schlank und doch fest gebaut, er trug ein anliegendes schwarzes Kleid, das, ähnlich den Reiseanzügen, mit verschiedenen Falten, Taschen, Schnallen, Knöpfen und einem Gürtel versehen war und infolgedessen, ohne daß man sich darüber klar wurde, wozu es dienen sollte, besonders praktisch erschien. "Wer sind Sie?" fragte K. und saß gleich halb aufrecht im Bett. Der Mann aber ging über die Frage hinweg, als müsse man seine Erscheinung hinnehmen, und sagte bloß seinerseits: "Sie haben geläutet?" "Anna soll mir das Frühstück bringen", sagte K. und versuchte, zunächst stillschweigend, durch Aufmerksamkeit und Überlegung festzustellen, wer der Mann eigentlich war. Aber dieser setzte sich nicht allzulange seinen Blicken aus, sondern wandte sich zur Tür, die er ein wenig öffnete, um jemandem, der offenbar knapp hinter der Tür stand, zu sagen: "Er will, daß Anna ihm das Frühstück bringt." Ein kleines Gelächter im Nebenzimmer folgte, es war nach dem Klang nicht sicher, ob nicht mehrere Personen daran beteiligt waren. Obwohl der fremde Mann dadurch nichts erfahren haben konnte, was er nicht schon früher gewußt hätte, sagte er nun doch zu K. im Tone einer Meldung: "Es ist unmöglich." "Das wäre neu", sagte K., sprang aus dem Bett und zog rasch seine Hosen an. "Ich will doch sehen, was für Leute im Nebenzimmer sind und wie Frau Grubach diese Störung mir gegenüber verantworten wird." Es fiel ihm zwar gleich ein, daß er das nicht hätte laut sagen müssen und daß er dadurch gewissermaßen ein Beaufsichtigungsrecht des Fremden anerkannte, aber es schien ihm jetzt nicht wichtig. Immerhin faßte es der Fremde so auf, denn er sagte: "Wollen Sie nicht lieber hierbleiben?" "Ich will weder hierbleiben, noch von Ihnen angesprochen werden, solange Sie sich mir nicht vorstellen." "Es war gut gemeint", sagte der Fremde und öffnete nun freiwillig die Tür. Im Nebenzimmer, in das K. langsamer eintrat, als er wollte, sah es auf den ersten Blick fast genau so aus wie am Abend vorher. Es war das Wohnzimmer der Frau Grubach, vielleicht war in diesem mit Möbeln, Decken, Porzellan und Photographien überfüllten Zimmer heute ein wenig mehr Raum als sonst, man erkannte das nicht gleich, um so weniger, als die Hauptveränderung in der Anwesenheit eines Mannes bestand, der beim offenen Fenster mit einem Buch saß, von dem er jetzt aufblickte. "Sie hätten in Ihrem Zimmer bleiben sollen! Hat es Ihnen denn Franz nicht gesagt?" "Ja, was wollen Sie denn?" sagte K. und sah von der neuen Bekanntschaft zu dem mit Franz Benannten, der in der Tür stehengeblieben war, und dann wieder zurück. Durch das offene Fenster erblickte man wieder die alte Frau, die mit wahrhaft greisenhafter Neugierde zu dem jetzt gegenüberliegenden Fenster getreten war, um auch weiterhin alles zu sehen. "Ich will doch Frau Grubach -", sagte K., machte eine Bewegung, als reiße er sich von den zwei Männern los, die aber weit von ihm entfernt standen, und wollte weitergehen. "Nein", sagte der Mann beim Fenster, warf das Buch auf ein Tischchen und stand auf. "Sie dürfen nicht weggehen, Sie sind ja verhaftet." "Es sieht so aus", sagte K. "Und warum denn?" fragte er dann. "Wir sind nicht dazu bestellt, Ihnen das zu sagen. Gehen Sie in Ihr Zimmer und warten Sie. Das Verfahren ist nun einmal eingeleitet, und Sie werden alles zur richtigen Zeit erfahren. Ich gehe über meinen Auftrag hinaus, wenn ich Ihnen so freundschaftlich zurede. Aber ich hoffe, es hört es niemand sonst als Franz, und der ist selbst gegen alle Vorschrift freundlich zu Ihnen. Wenn Sie auch weiterhin so viel Glück haben wie bei der Bestimmung Ihrer Wächter, dann können Sie zuversichtlich sein." K. wollte sich setzen, aber nun sah er, daß im ganzen Zimmer keine Sitzgelegenheit war, außer dem Sessel beim Fenster. "Sie werden noch einsehen, wie wahr das alles ist", sagte Franz und ging gleichzeitig mit dem andern Mann auf ihn zu. Besonders der letztere überragte K. bedeutend und klopfte ihm öfters auf die Schulter. Beide prüften K.s Nachthemd und sagten, daß er jetzt ein viel schlechteres Hemd werde anziehen müssen, daß sie aber dieses Hemd wie auch seine übrige Wäsche aufbewahren und, wenn seine Sache günstig ausfallen sollte, ihm wieder zurückgeben würden. "Es ist besser, Sie geben die Sachen uns als ins Depot", sagten sie, "denn im Depot kommen öfters Unterschleife vor und außerdem verkauft man dort alle Sachen nach einer gewissen Zeit, ohne Rücksicht, ob das betreffende Verfahren zu Ende ist oder nicht. Und wie lange dauern doch derartige Prozesse, besonders in letzter Zeit! Sie bekämen dann schließlich allerdings vom Depot den Erlös, aber dieser Erlös ist erstens an sich schon gering, denn beim Verkauf entscheidet nicht die Höhe des Angebotes, sondern die Höhe der Bestechung, und weiter verringern sich solche Erlöse erfahrungsgemäß, wenn sie von Hand zu Hand und von Jahr zu Jahr weitergegeben werden." K. achtete auf diese Reden kaum, das Verfügungsrecht über seine Sachen, das er vielleicht noch besaß, schätzte er nicht hoch ein, viel wichtiger war es ihm, Klarheit über seine Lage zu bekommen; in Gegenwart dieser Leute konnte er aber nicht einmal nachdenken, immer wieder stieß der Bauch des zweiten Wächters - es konnten ja nur Wächter sein - förmlich freundschaftlich an ihn, sah er aber auf, dann erblickte er ein zu diesem dicken Körper gar nicht passendes trockenes, knochiges Gesicht mit starker, seitlich gedrehter Nase, das sich über ihn hinweg mit dem anderen Wächter verständigte. Was waren denn das für Menschen? Wovon sprachen sie? Welcher Behörde gehörten sie an? K. lebte doch in einem Rechtsstaat, überall herrschte Friede, alle Gesetze bestanden aufrecht, wer wagte, ihn in seiner Wohnung zu überfallen? Er neigte stets dazu, alles möglichst leicht zu nehmen, das Schlimmste erst beim Eintritt des Schlimmsten zu glauben, keine Vorsorge für die Zukunft zu treffen, selbst wenn alles drohte. Hier schien ihm das aber nicht richtig, man konnte zwar das Ganze als Spaß ansehen, als einen groben Spaß, den ihm aus unbekannten Gründen, vielleicht weil heute sein dreißigster Geburtstag war, die Kollegen in der Bank veranstaltet hatten, es war natürlich möglich, vielleicht brauchte er nur auf irgendeine Weise den Wächtern ins Gesicht zu lachen, und sie würden mitlachen, vielleicht waren es Dienstmänner von der Straßenecke, sie sahen ihnen nicht unähnlich - trotzdem war er diesmal, förmlich schon seit dem ersten Anblick des Wächters Franz, entschlossen, nicht den geringsten Vorteil, den er vielleicht gegenüber diesen Leuten besaß, aus der Hand zu geben. Darin, daß man später sagen würde, er habe keinen Spaß verstanden, sah K. eine ganz geringe Gefahr, wohl aber erinnerte er sich - ohne daß es sonst seine Gewohnheit gewesen wäre, aus Erfahrungen zu lernen - an einige, an sich unbedeutende Fälle, in denen er zum Unterschied von seinen Freunden mit Bewußtsein, ohne das geringste Gefühl für die möglichen Folgen, sich unvorsichtig benommen hatte und dafür durch das Ergebnis gestraft worden war. Es sollte nicht wieder geschehen, zumindest nicht diesmal; war es eine Komödie, so wollte er mitspielen. + +Noch war er frei. "Erlauben Sie", sagte er und ging eilig zwischen den Wächtern durch in sein Zimmer. "Er scheint vernünftig zu sein", hörte er hinter sich sagen. In seinem Zimmer riß er gleich die Schubladen des Schreibtischs auf, es lag dort alles in großer Ordnung, aber gerade die Legitimationspapiere, die er suchte, konnte er in der Aufregung nicht gleich finden. Schließlich fand er seine Radfahrlegitimation und wollte schon mit ihr zu den Wächtern gehen, dann aber schien ihm das Papier zu geringfügig und er suchte weiter, bis er den Geburtsschein fand. Als er wieder in das Nebenzimmer zurückkam, öffnete sich gerade die gegenüberliegende Tür und Frau Grubach wollte dort eintreten. Man sah sie nur einen Augenblick, denn kaum hatte sie K. erkannt, als sie offenbar verlegen wurde, um Verzeihung bat, verschwand und äußerst vorsichtig die Tür schloß. "Kommen Sie doch herein", hatte K. gerade noch sagen können. Nun aber stand er mit seinen Papieren in der Mitte des Zimmers, sah noch auf die Tür hin, die sich nicht wieder öffnete, und wurde erst durch einen Anruf der Wächter aufgeschreckt, die bei dem Tischchen am offenen Fenster saßen und, wie K. jetzt erkannte, sein Frühstück verzehrten. "Warum ist sie nicht eingetreten?" fragte er. "Sie darf nicht", sagte der große Wächter. "Sie sind doch verhaftet." "Wie kann ich denn verhaftet sein? Und gar auf diese Weise?" "Nun fangen Sie also wieder an", sagte der Wächter und tauchte ein Butterbrot ins Honigfäßchen. "Solche Fragen beantworten wir nicht." "Sie werden sie beantworten müssen", sagte K. "Hier sind meine Legitimationspapiere, zeigen Sie mir jetzt die Ihrigen und vor allem den Verhaftbefehl." "Du lieber Himmel!" sagte der Wächter. "Daß Sie sich in Ihre Lage nicht fügen können und daß Sie es darauf angelegt zu haben scheinen, uns, die wir Ihnen jetzt wahrscheinlich von allen Ihren Mitmenschen am nächsten stehen, nutzlos zu reizen!" "Es ist so, glauben Sie es doch", sagte Franz, führte die Kaffeetasse, die er in der Hand hielt, nicht zum Mund, sondern sah K. mit einem langen, wahrscheinlich bedeutungsvollen, aber unverständlichen Blick an. K. ließ sich, ohne es zu wollen, in ein Zwiegespräch der Blicke mit Franz ein, schlug dann aber doch auf seine Papiere und sagte: "Hier sind meine Legitimationspapiere." "Was kümmern uns denn die?" rief nun schon der große Wächter. "Sie führen sich ärger auf als ein Kind. Was wollen Sie denn? Wollen Sie Ihren großen, verfluchten Prozeß dadurch zu einem raschen Ende bringen, daß Sie mit uns, den Wächtern, über Legitimation und Verhaftbefehl diskutieren? Wir sind niedrige Angestellte, die sich in einem Legitimationspapier kaum auskennen und die mit Ihrer Sache nichts anderes zu tun haben, als daß sie zehn Stunden täglich bei Ihnen Wache halten und dafür bezahlt werden. Das ist alles, was wir sind, trotzdem aber sind wir fähig, einzusehen, daß die hohen Behörden, in deren Dienst wir stehen, ehe sie eine solche Verhaftung verfügen, sich sehr genau über die Gründe der Verhaftung und die Person des Verhafteten unterrichten. Es gibt darin keinen Irrtum. Unsere Behörde, soweit ich sie kenne, und ich kenne nur die niedrigsten Grade, sucht doch nicht etwa die Schuld in der Bevölkerung, sondern wird, wie es im Gesetz heißt, von der Schuld angezogen und muß uns Wächter ausschicken. Das ist Gesetz. Wo gäbe es da einen Irrtum?" "Dieses Gesetz kenne ich nicht", sagte K. "Desto schlimmer für Sie", sagte der Wächter. "Es besteht wohl auch nur in Ihren Köpfen", sagte K., er wollte sich irgendwie in die Gedanken der Wächter einschleichen, sie zu seinen Gunsten wenden oder sich dort einbürgern. Aber der Wächter sagte nur abweisend: "Sie werden es zu fühlen bekommen." Franz mischte sich ein und sagte: "Sieh, Willem, er gibt zu, er kenne das Gesetz nicht, und behauptet gleichzeitig, schuldlos zu sein." "Du hast ganz recht, aber ihm kann man nichts begreiflich machen", sagte der andere. K. antwortete nichts mehr; muß ich, dachte er, durch das Geschwätz dieser niedrigsten Organe - sie geben selbst zu, es zu sein - mich noch mehr verwirren lassen? Sie reden doch jedenfalls von Dingen, die sie gar nicht verstehen. Ihre Sicherheit ist nur durch ihre Dummheit möglich. Ein paar Worte, die ich mit einem mir ebenbürtigen Menschen sprechen werde, werden alles unvergleichlich klarer machen als die längsten Reden mit diesen. Er ging einige Male in dem freien Raum des Zimmers auf und ab, drüben sah er die alte Frau, die einen noch viel älteren Greis zum Fenster gezerrt hatte, den sie umschlungen hielt. K. mußte dieser Schaustellung ein Ende machen: "Führen Sie mich zu Ihrem Vorgesetzten", sagte er. "Wenn er es wünscht; nicht früher", sagte der Wächter, der Willem genannt worden war. "Und nun rate ich Ihnen", fügte er hinzu, "in Ihr Zimmer zu gehen, sich ruhig zu verhalten und darauf zu warten, was über Sie verfügt werden wird. Wir raten Ihnen, zerstreuen Sie sich nicht durch nutzlose Gedanken, sondern sammeln Sie sich, es werden große Anforderungen an Sie gestellt werden. Sie haben uns nicht so behandelt, wie es unser Entgegenkommen verdient hätte, Sie haben vergessen, daß wir, mögen wir auch sein was immer, zumindest jetzt Ihnen gegenüber freie Männer sind, das ist kein kleines Übergewicht. Trotzdem sind wir bereit, falls Sie Geld haben, Ihnen ein kleines Frühstück aus dem Kaffeehaus drüben zu bringen." + +Ohne auf dieses Angebot zu antworten, stand K. ein Weilchen lang still. Vielleicht würden ihn die beiden, wenn er die Tür des folgenden Zimmers oder gar die Tür des Vorzimmers öffnete, gar nicht zu hindern wagen, vielleicht wäre es die einfachste Lösung des Ganzen, daß er es auf die Spitze trieb. Aber vielleicht würden sie ihn doch packen und, war er einmal niedergeworfen, so war auch alle Überlegenheit verloren, die er jetzt ihnen gegenüber in gewisser Hinsicht doch wahrte. Deshalb zog er die Sicherheit der Lösung vor, wie sie der natürliche Verlauf bringen mußte, und ging in sein Zimmer zurück, ohne daß von seiner Seite oder von Seite der Wächter ein weiteres Wort gefallen wäre. + +Er warf sich auf sein Bett und nahm vom Waschtisch einen schönen Apfel, den er sich gestern abend für das Frühstück vorbereitet hatte. Jetzt war er sein einziges Frühstück und jedenfalls, wie er sich beim ersten großen Bissen versicherte, viel besser, als das Frühstück aus dem schmutzigen Nachtcafé gewesen wäre, das er durch die Gnade der Wächter hätte bekommen können. Er fühlte sich wohl und zuversichtlich, in der Bank versäumte er zwar heute vormittag seinen Dienst, aber das war bei der verhältnismäßig hohen Stellung, die er dort einnahm, leicht entschuldigt. Sollte er die wirkliche Entschuldigung anführen? Er gedachte es zu tun, Würde man ihm nicht glauben, was in diesem Fall begreiflich war, so konnte er Frau Grubach als Zeugin führen oder auch die beiden Alten von drüben, die wohl jetzt auf dem Marsch zum gegenüberliegenden Fenster waren. Es wunderte K., wenigstens aus dem Gedankengang der Wächter wunderte es ihn, daß sie ihn in das Zimmer getrieben und ihn hier allein gelassen hatten, wo er doch zehnfache Möglichkeit hatte, sich umzubringen. Gleichzeitig allerdings fragte er sich, diesmal aus seinem Gedankengang, was für einen Grund er haben könnte, es zu tun. Etwa weil die zwei nebenan saßen und sein Frühstück abgefangen hatten? Es wäre so sinnlos gewesen, sich umzubringen, daß er, selbst wenn er es hätte tun wollen, infolge der Sinnlosigkeit dazu nicht imstande gewesen wäre. Wäre die geistige Beschränktheit der Wächter nicht so auffallend gewesen, so hätte man annehmen können, daß auch sie, infolge der gleichen Überzeugung, keine Gefahr darin gesehen hätten, ihn allein zu lassen. Sie mochten jetzt, wenn sie wollten, zusehen, wie er zu einem Wandschränkchen ging, in dem er einen guten Schnaps aufbewahrte, wie er ein Gläschen zuerst zum Ersatz des Frühstücks leerte und wie er ein zweites Gläschen dazu bestimmte, sich Mut zu machen, das letztere nur aus Vorsicht für den unwahrscheinlichen Fall, daß es nötig sein sollte. + + diff --git a/Input_und_Output_001/readme.md b/Input_und_Output_001/readme.md new file mode 100644 index 0000000..b3dfbe0 --- /dev/null +++ b/Input_und_Output_001/readme.md @@ -0,0 +1,39 @@ +# `BufferedReader` zum zeilenweisen Lesen einsetzen +## Lernziel + + + +Daten Zeilenweise mit einem `BufferedReader` verwenden und dabei das Decorator Pattern einsetzen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.buffered_reader](../sources/src/main/java/pr2/io/buffered_reader/). + +Lesen Sie die Datei [kafka.txt](../sources/src/main/resources/pr2/io/buffered_reader/kafka.txt) zeilenweise ein und geben Sie die Zeilen mit einer fortlaufenden Zeilennummer wieder aus. Verwenden Sie hierzu einen `BufferedReader`. + +Eine beispielhafte Ausgabe sieht wie folgt aus: + +```console +1: Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner +2: +3: Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses +4: getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau +5: Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh +6: das Frühstück brachte, kam diesmal nicht. Das war noch niemals +``` + +Lassen Sie das Programm laufen und überprüfen Sie, ob die Ausgabe korrekt ist. Die Beispieldatei hat 232 Zeilen. + + + \ No newline at end of file diff --git a/Input_und_Output_002/readme.md b/Input_und_Output_002/readme.md new file mode 100644 index 0000000..bdbab59 --- /dev/null +++ b/Input_und_Output_002/readme.md @@ -0,0 +1,38 @@ +# DataOutputStream +## Lernziel + + + +Daten mit einem `DataOutputStreams` manuell serialisieren. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.datainputoutput_1](../sources/src/main/java/pr2/io/datainputoutput_1/). + +Schreiben Sie eine Klasse `DateWriter`, die ein Datum in der Form yyyy-MM-dd (z.B. 1997-08-29) von der Konsole annimmt und als `long`-Wert mithilfe eines `DataOutputStreams` in eine Datei schreibt. + +Schreiben Sie eine Klasse `DateReader`, die den `long`-Wert aus der Datei ausliest und wieder in das ursprüngliche Format bringt und auf der Konsole ausgibt. + +**Hinweis:** Zur Konvertierung eines Strings in ein Datum und umgekehrt, können Sie die Klasse `SimpleDateFormat` verwenden. Ein `Date`-Objekt lässt sich leicht über die Methode `getTime` in einen `long`-Wert umwandeln. Denken Sie an eine korrekte Behandlung von möglichen Fehlern. + +```console +> java DateWriter 1997-08-29 +> java DateReader +Das Datum war: 1997-08-29 +``` + +**Zusatzfrage:** Welche besondere Bedeutung hat das hier als Beispiel verwendete Datum? + + + \ No newline at end of file diff --git a/Input_und_Output_003/readme.md b/Input_und_Output_003/readme.md new file mode 100644 index 0000000..8f0233e --- /dev/null +++ b/Input_und_Output_003/readme.md @@ -0,0 +1,28 @@ +# DataOutputStream durch Serialisierung ersetzen +## Lernziel + + + +Daten mit einem `ObjectOutputStreams` serialisieren. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.datainputoutput_2](../sources/src/main/java/pr2/io/datainputoutput_2/). + +Verändern Sie die beiden Klassen aus der vorhergehenden Aufgabe so, dass sie jetzt anstatt eines `DataOutputStreams` bzw. eines `DataInputStreams` Serialisierung verwenden. + +Vergleichen Sie bitte die Dateien, die bei diesem und der anderen Lösung entstanden sind. Was fällt ihnen auf? + + + \ No newline at end of file diff --git a/Input_und_Output_004/readme.md b/Input_und_Output_004/readme.md new file mode 100644 index 0000000..4f919a2 --- /dev/null +++ b/Input_und_Output_004/readme.md @@ -0,0 +1,53 @@ +# Daten mit `DataOutputStream` und `DataInputStream` verarbeiten +## Lernziel + + + +Ein eigenes Format für die Daten einer Klasse definieren und diese Dann in einer Datei speichern und aus dieser wieder laden. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.data_output](../sources/src/main/java/pr2/io/data_output/). + +In dieser Aufgabe finden Sie bereits eine fertig implementierte Klasse `Board` vor, die ein Schachbrett repräsentiert. Allerdings wird dieses nicht für Schach benutzt, sondern für ein Spiel, bei dem man nur schwarze und weiße Steine auf das Brett stellen kann (z.B. Dame). Die Farbe der Steine wird durch die Enumeration `Color` dargestellt. + +Was bei dem Schachbrett allerdings noch fehlt, ist eine Möglichkeit den Spielstand zu speichern und später wieder einzulesen. + +Schauen Sie sich die Klassen `Board` und `Color` genau an und versuchen Sie diese zu verstehen. Sie können auch testweise ein Brett anlegen und mit Daten befüllen. (Wie dies geht, sehen Sie im JUnit-Test). Die `toString()`-Methode liefert eine anschauliche Darstellung des Spielfeldes. + +Implementieren Sie nun die Methoden `writeToFile` und `loadFromFile` unter Zuhilfenahme von `DateOutputStream` und `DataInputStream`. Hierzu müssen Sie noch das Datenformat für die Speicherung festlegen. Dieses ist wie folgt definiert: + + 1. Als erstes der String "Schachbrett" im UTF8-Format, um das Datenformat zu kennzeichnen. + 2. Die Koordinaten der ersten Figur im Format x-Pos, y-Pos (beide als `byte`) und Farbe entsprechend `Color.ordinal()` (als `int`) + 3. Wiederholung von Schritt 2. bis alle Figuren gespeichert sind. + 4. Werte `0xff`, `0xff`, `-1`, um das Dateiende zu kennzeichnen + +Lassen Sie den JUnit-Test laufen, um zu sehen, ob die Daten korrekt verarbeitet werden. + + + + + + \ No newline at end of file diff --git a/Input_und_Output_005/daten.dat b/Input_und_Output_005/daten.dat new file mode 100644 index 0000000000000000000000000000000000000000..8d3eacd7ecd6a943f577be019bf3c9cd194adbf8 GIT binary patch literal 10 ScmX^0|KF~C4ENUVdk+9ANe6fU literal 0 HcmV?d00001 diff --git a/Input_und_Output_005/readme.md b/Input_und_Output_005/readme.md new file mode 100644 index 0000000..7656507 --- /dev/null +++ b/Input_und_Output_005/readme.md @@ -0,0 +1,34 @@ +# Daten mit einem `InputStream` lesen +## Lernziel + + + +Einen `InputStream` benutzen, um Daten aus einer Datei zu lesen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.datei_lesen](../sources/src/main/java/pr2/io/datei_lesen/). + +Lesen Sie die Daten aus der Datei [daten.dat](../sources/src/main/resources/pr2/io/datei_lesen/daten.dat) byteweise und geben Sie den Inhalt auf der Konsole aus. Für die Ausgabe verwenden Sie bitte die Hexadezimale Darstellung, also z.B. `0x0a` für den Wert 11. + +Lassen Sie das Programm laufen und betrachten Sie die Ausgabe. Wenn Sie alles korrekt implementiert haben, sollten Sie den Text + + 0xca 0xff 0xfe 0xba 0xbe 0x0 0xde 0xad 0xbe 0xef + +sehen. + +Denken Sie auch an eine Fehlerbehandlung für eventuelle Ausnahmen im Zusammenhang mit der Datei. + + + \ No newline at end of file diff --git a/Input_und_Output_006/readme.md b/Input_und_Output_006/readme.md new file mode 100644 index 0000000..729007b --- /dev/null +++ b/Input_und_Output_006/readme.md @@ -0,0 +1,36 @@ +# Daten mit einem `OutputStream` schreiben +## Lernziel + + + +Einen `OutputStream` verwenden, um Daten zu schreiben. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.datei_schreiben](../sources/src/main/java/pr2/io/datei_schreiben/). + +In dieser Aufgabe sollen Sie eine Reihe von Bytes in eine Datei schreiben. Ein JUnit-Test wird überprüfen, ob Sie dies richtig getan haben. + +Öffnen Sie einen passenden `OutputStream`, um in die Datei `output/daten.dat` zu schreiben (verwenden Sie die Konstante `FILE` für den Dateinamen). Schreiben Sie nun die Byte-Folge + +```console +0xca 0xff 0xfe 0xba 0xbe 0x0 0xde 0xad 0xbe 0xef +``` + +hinein und schließen Sie die Datei wieder. + +Führen Sie den JUnit-Test aus, der überprüft, ob alle Daten korrekt in die Datei geschrieben wurden. + + + \ No newline at end of file diff --git a/Input_und_Output_007/readme.md b/Input_und_Output_007/readme.md new file mode 100644 index 0000000..ed6c479 --- /dev/null +++ b/Input_und_Output_007/readme.md @@ -0,0 +1,47 @@ +# Filesystem-Abstraktion mit `File` +## Lernziel + + + +Die Klasse `Path` einsetzen, um plattformunabhängig Operationen auf dem Dateisystem durchzuführen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.file](../sources/src/main/java/pr2/io/file/). + +Benutzen Sie die Klasse `Path`, um die Festplatte Ihres Computers, ausgehend von dem als `root` bezeichneten Verzeichnis `../..` zu durchsuchen und die Größe der Verzeichnisse zu berechnen. + +Sie können die Größe eines Verzeichnisses nur indirekt bestimme, indem Sie die Größe aller Dateien in dem Verzeichnis addieren. Das Verzeichnis direkt kann man _nicht_ mit `size()` nach seiner Größe fragen, wohl aber normale Dateien. Deswegen müssen Sie in Ihrem Programm immer sauber unterscheiden, ob ein Verzeichnis vorliegt (das sie rekursiv durchlaufen müssen) oder eine normale Datei (deren Größe Sie abfragen). + +Geben Sie die Verzeichnisse mit Ihrer Größe aus. Am Ende des Programms geben Sie noch die Gesamtgröße aller Unterverzeichnisse aus. Eine beispielhafte sähe wie folgt aus: + +```console +Untersuche: /home/thomas/eclipse-workspace + +465 Byte - /home/thomas/eclipse-workspace/.recommenders/snipmatch/repositories +1,4 kByte - /home/thomas/eclipse-workspace/.recommenders/snipmatch +4,6 MByte - /home/thomas/eclipse-workspace/.recommenders +57,5 MByte - /home/thomas/eclipse-workspace +103 Byte - /home/thomas/lib/.settings +5,8 MByte - /home/thomas/lib + +Gesamtgröße: 80,4 MByte +``` + +Lassen Sie Ihr Programm laufen und überprüfen Sie, ob die Ausgaben plausibel sind. Vergleichen Sie das Ergebnis mit den Angaben des Windows-Explorers, Mac-Finders oder Linux-Dateimanagers. + +Unter Linux und MacOS müssen Sie darauf achten, dass Sie symbolischen Links in Ihrem Programm nicht folgen, sonst zählen Sie möglicherweise zu viel. + + + \ No newline at end of file diff --git a/Input_und_Output_008/readme.md b/Input_und_Output_008/readme.md new file mode 100644 index 0000000..f00effd --- /dev/null +++ b/Input_und_Output_008/readme.md @@ -0,0 +1,42 @@ +# Fileattribute lesen +## Lernziel + + + +Methoden der Klassen `Path` und `Files` nutzen und verstehen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.filetest](../sources/src/main/java/pr2/io/filetest/). + +Schreiben Sie eine Klasse `FileInfo`, der man auf der Konsole einen Datei- oder Verzeichnisnamen übergeben kann. Sie soll dann einige grundlegende Informationen über die Datei ausgeben (siehe Beispiel). + +```console +> java FileTest /Users/thomas/Documents/../Documents/ +/Users/thomas/Documents existiert +/Users/thomas/Documents ist 408 Bytes groß +/Users/thomas/Documents ist ein Verzeichnis +/Users/thomas/Documents darf gelesen werden +/Users/thomas/Documents darf geschrieben werden + +> java FileTest /Users/thomas/Documents/../Documents/Uebungsklausur.pages +/Users/thomas/Documents/Uebungsklausur.pages existiert +/Users/thomas/Documents/Uebungsklausur.pages ist 258920 Bytes groß +/Users/thomas/Documents/Uebungsklausur.pages ist ein normale Datei +/Users/thomas/Documents/Uebungsklausur.pages darf gelesen werden +/Users/thomas/Documents/Uebungsklausur.pages darf geschrieben werden +``` + + + \ No newline at end of file diff --git a/Input_und_Output_009/readme.md b/Input_und_Output_009/readme.md new file mode 100644 index 0000000..f16bd04 --- /dev/null +++ b/Input_und_Output_009/readme.md @@ -0,0 +1,28 @@ +# `FilterReader` +## Lernziel + + + +Einen eigenen Filter in Form eines `FilterReaders` programmieren und hiermit in den Datenstrom eingreifen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.filter](../sources/src/main/java/pr2/io/filter/). + +Vervollständigen Sie die Klasse `UCaseReader` so, dass Sie als Filter (`FilterReader`) verwendet werden kann. Die Aufgabe dieses Filters besteht darin, alle gelesenen Zeichen in Großbuchstaben umzuwandeln. + +Testen Sie, ob Ihre Implementierung korrekt ist, indem Sie die JUnit-Tests ausführen. + + + \ No newline at end of file diff --git a/Input_und_Output_010/readme.md b/Input_und_Output_010/readme.md new file mode 100644 index 0000000..1856bac --- /dev/null +++ b/Input_und_Output_010/readme.md @@ -0,0 +1,30 @@ +# Konsolen Input/Output +## Lernziel + + + +Daten von der Konsole lesen und über eine Ausgabeumlenkung in eine Datei umlenken. `PrintStream` und `InputStreamReader` einsetzen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.konsole](../sources/src/main/java/pr2/io/konsole/). + +Lesen Sie zeilenweise mithilfe eines `BufferedReaders` von der Konsole Zeichen ein. Geben Sie diese wieder auf `System.out` aus und zeigen Sie die aktuelle Zeilennummer auf `System.err` an. + +Testen Sie das Programm. + +Lenken Sie nun die Ausgabe von `System.out` in die Datei `output/console.log` um (siehe Konstante `LOGFILE`). Lassen Sie das Programm erneut laufen und betrachten Sie danach die Datei mit den umgeleiteten Daten. + + + \ No newline at end of file diff --git a/Input_und_Output_011/readme.md b/Input_und_Output_011/readme.md new file mode 100644 index 0000000..b7c2b0c --- /dev/null +++ b/Input_und_Output_011/readme.md @@ -0,0 +1,31 @@ +# Zeilen einer Textdatei zählen +## Lernziel + + + +Dateien zeilenweise lesen und verarbeiten. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.linecounter](../sources/src/main/java/pr2/io/linecounter/). + +Schreiben Sie eine Klasse `LineCounter`, die den Namen einer Textdatei von der Kommandozeile entgegennimmt und dann die Anzahl der Zeilen in der Datei ausgibt. + +```console +> java LineCounter ../src/LineCounter.java +Datei: ../src/LineCounter.java hat 30 Zeilen +``` + + + \ No newline at end of file diff --git a/Input_und_Output_012/data.dat b/Input_und_Output_012/data.dat new file mode 100644 index 0000000000000000000000000000000000000000..33a685580299d03e84b67d2d69ae52fb5eb2fdee GIT binary patch literal 100 zcmY%PD$pn})^bocv2u~ENm679P%NyAPO>YH=F(tD^Y=+gH@1%k<%6&5tw< zm&g~$3gt<(kSNJ5X3dhR43Tp!$qi2ybxTfkl4Oe3R+CJ&Hq)&v@vKr-&*s)EFjoNp D9Jd-0 literal 0 HcmV?d00001 diff --git a/Input_und_Output_012/readme.md b/Input_und_Output_012/readme.md new file mode 100644 index 0000000..a02cae2 --- /dev/null +++ b/Input_und_Output_012/readme.md @@ -0,0 +1,32 @@ +# `RandomAccessFile` +## Lernziel + + + +`RandomAccessFile` sowohl zum Lesen, als auch zum Schreiben von Daten einsetzen. Verstehen, dass man sich wahlfrei durch die Datei bewegen kann. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.random_access](../sources/src/main/java/pr2/io/random_access/). + +Bei dieser Aufgabe werden Sie ein Verfahren anwenden, das bei sehr großen Datenmengen zum Einsatz kommt: das Sortieren der Daten direkt auf der Festplatte, ohne sie vollständig in den Hauptspeicher zu laden. + +Implementieren Sie einen [Bubblesort](https://de.wikipedia.org/wiki/Bubblesort) mithilfe von `RandomAccessFile` direkt auf einer Datei. Bubblesort ist ein ausgesprochen ineffizienter Algorithmus (O(n*n)), er ist aber sehr einfach zu implementieren. Da die zu sortierende Datei klein ist, können wir hier mit den Nachteilen von Bubblesort leben. + +Implementieren Sie die bereits vorhandene Methode `sortFile` der Klasse `FileSort`. Öffnen Sie zuerst die Datei mithilfe von `RandomAccessFile` im Modus `"rw"`. Wandern Sie nun - entsprechend dem Bubblesort-Algorithmus - über die Daten und sortieren Sie die Bytes der Datei. Halten Sie nie mehr als zwei `byte` und die Position als `long` im Speicher. Weitere Variablen können auch noch nötig sein, um den Algorithmus zu implementieren. + +Testen Sie Ihre Implementierung mit den JUnit-Tests. Die Testdatei für den Unit-Test ist [data.dat](../sources/src/main/resources/pr2/io/random_access/data.dat) + + + \ No newline at end of file diff --git a/Input_und_Output_013/kafka.txt b/Input_und_Output_013/kafka.txt new file mode 100644 index 0000000..b5695c5 --- /dev/null +++ b/Input_und_Output_013/kafka.txt @@ -0,0 +1,11 @@ +Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner + +Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh das Frühstück brachte, kam diesmal nicht. Das war noch niemals geschehen. K. wartete noch ein Weilchen, sah von seinem Kopfkissen aus die alte Frau, die ihm gegenüber wohnte und die ihn mit einer an ihr ganz ungewöhnlichen Neugierde beobachtete, dann aber, gleichzeitig befremdet und hungrig, läutete er. Sofort klopfte es und ein Mann, den er in dieser Wohnung noch niemals gesehen hatte, trat ein. Er war schlank und doch fest gebaut, er trug ein anliegendes schwarzes Kleid, das, ähnlich den Reiseanzügen, mit verschiedenen Falten, Taschen, Schnallen, Knöpfen und einem Gürtel versehen war und infolgedessen, ohne daß man sich darüber klar wurde, wozu es dienen sollte, besonders praktisch erschien. "Wer sind Sie?" fragte K. und saß gleich halb aufrecht im Bett. Der Mann aber ging über die Frage hinweg, als müsse man seine Erscheinung hinnehmen, und sagte bloß seinerseits: "Sie haben geläutet?" "Anna soll mir das Frühstück bringen", sagte K. und versuchte, zunächst stillschweigend, durch Aufmerksamkeit und Überlegung festzustellen, wer der Mann eigentlich war. Aber dieser setzte sich nicht allzulange seinen Blicken aus, sondern wandte sich zur Tür, die er ein wenig öffnete, um jemandem, der offenbar knapp hinter der Tür stand, zu sagen: "Er will, daß Anna ihm das Frühstück bringt." Ein kleines Gelächter im Nebenzimmer folgte, es war nach dem Klang nicht sicher, ob nicht mehrere Personen daran beteiligt waren. Obwohl der fremde Mann dadurch nichts erfahren haben konnte, was er nicht schon früher gewußt hätte, sagte er nun doch zu K. im Tone einer Meldung: "Es ist unmöglich." "Das wäre neu", sagte K., sprang aus dem Bett und zog rasch seine Hosen an. "Ich will doch sehen, was für Leute im Nebenzimmer sind und wie Frau Grubach diese Störung mir gegenüber verantworten wird." Es fiel ihm zwar gleich ein, daß er das nicht hätte laut sagen müssen und daß er dadurch gewissermaßen ein Beaufsichtigungsrecht des Fremden anerkannte, aber es schien ihm jetzt nicht wichtig. Immerhin faßte es der Fremde so auf, denn er sagte: "Wollen Sie nicht lieber hierbleiben?" "Ich will weder hierbleiben, noch von Ihnen angesprochen werden, solange Sie sich mir nicht vorstellen." "Es war gut gemeint", sagte der Fremde und öffnete nun freiwillig die Tür. Im Nebenzimmer, in das K. langsamer eintrat, als er wollte, sah es auf den ersten Blick fast genau so aus wie am Abend vorher. Es war das Wohnzimmer der Frau Grubach, vielleicht war in diesem mit Möbeln, Decken, Porzellan und Photographien überfüllten Zimmer heute ein wenig mehr Raum als sonst, man erkannte das nicht gleich, um so weniger, als die Hauptveränderung in der Anwesenheit eines Mannes bestand, der beim offenen Fenster mit einem Buch saß, von dem er jetzt aufblickte. "Sie hätten in Ihrem Zimmer bleiben sollen! Hat es Ihnen denn Franz nicht gesagt?" "Ja, was wollen Sie denn?" sagte K. und sah von der neuen Bekanntschaft zu dem mit Franz Benannten, der in der Tür stehengeblieben war, und dann wieder zurück. Durch das offene Fenster erblickte man wieder die alte Frau, die mit wahrhaft greisenhafter Neugierde zu dem jetzt gegenüberliegenden Fenster getreten war, um auch weiterhin alles zu sehen. "Ich will doch Frau Grubach -", sagte K., machte eine Bewegung, als reiße er sich von den zwei Männern los, die aber weit von ihm entfernt standen, und wollte weitergehen. "Nein", sagte der Mann beim Fenster, warf das Buch auf ein Tischchen und stand auf. "Sie dürfen nicht weggehen, Sie sind ja verhaftet." "Es sieht so aus", sagte K. "Und warum denn?" fragte er dann. "Wir sind nicht dazu bestellt, Ihnen das zu sagen. Gehen Sie in Ihr Zimmer und warten Sie. Das Verfahren ist nun einmal eingeleitet, und Sie werden alles zur richtigen Zeit erfahren. Ich gehe über meinen Auftrag hinaus, wenn ich Ihnen so freundschaftlich zurede. Aber ich hoffe, es hört es niemand sonst als Franz, und der ist selbst gegen alle Vorschrift freundlich zu Ihnen. Wenn Sie auch weiterhin so viel Glück haben wie bei der Bestimmung Ihrer Wächter, dann können Sie zuversichtlich sein." K. wollte sich setzen, aber nun sah er, daß im ganzen Zimmer keine Sitzgelegenheit war, außer dem Sessel beim Fenster. "Sie werden noch einsehen, wie wahr das alles ist", sagte Franz und ging gleichzeitig mit dem andern Mann auf ihn zu. Besonders der letztere überragte K. bedeutend und klopfte ihm öfters auf die Schulter. Beide prüften K.s Nachthemd und sagten, daß er jetzt ein viel schlechteres Hemd werde anziehen müssen, daß sie aber dieses Hemd wie auch seine übrige Wäsche aufbewahren und, wenn seine Sache günstig ausfallen sollte, ihm wieder zurückgeben würden. "Es ist besser, Sie geben die Sachen uns als ins Depot", sagten sie, "denn im Depot kommen öfters Unterschleife vor und außerdem verkauft man dort alle Sachen nach einer gewissen Zeit, ohne Rücksicht, ob das betreffende Verfahren zu Ende ist oder nicht. Und wie lange dauern doch derartige Prozesse, besonders in letzter Zeit! Sie bekämen dann schließlich allerdings vom Depot den Erlös, aber dieser Erlös ist erstens an sich schon gering, denn beim Verkauf entscheidet nicht die Höhe des Angebotes, sondern die Höhe der Bestechung, und weiter verringern sich solche Erlöse erfahrungsgemäß, wenn sie von Hand zu Hand und von Jahr zu Jahr weitergegeben werden." K. achtete auf diese Reden kaum, das Verfügungsrecht über seine Sachen, das er vielleicht noch besaß, schätzte er nicht hoch ein, viel wichtiger war es ihm, Klarheit über seine Lage zu bekommen; in Gegenwart dieser Leute konnte er aber nicht einmal nachdenken, immer wieder stieß der Bauch des zweiten Wächters - es konnten ja nur Wächter sein - förmlich freundschaftlich an ihn, sah er aber auf, dann erblickte er ein zu diesem dicken Körper gar nicht passendes trockenes, knochiges Gesicht mit starker, seitlich gedrehter Nase, das sich über ihn hinweg mit dem anderen Wächter verständigte. Was waren denn das für Menschen? Wovon sprachen sie? Welcher Behörde gehörten sie an? K. lebte doch in einem Rechtsstaat, überall herrschte Friede, alle Gesetze bestanden aufrecht, wer wagte, ihn in seiner Wohnung zu überfallen? Er neigte stets dazu, alles möglichst leicht zu nehmen, das Schlimmste erst beim Eintritt des Schlimmsten zu glauben, keine Vorsorge für die Zukunft zu treffen, selbst wenn alles drohte. Hier schien ihm das aber nicht richtig, man konnte zwar das Ganze als Spaß ansehen, als einen groben Spaß, den ihm aus unbekannten Gründen, vielleicht weil heute sein dreißigster Geburtstag war, die Kollegen in der Bank veranstaltet hatten, es war natürlich möglich, vielleicht brauchte er nur auf irgendeine Weise den Wächtern ins Gesicht zu lachen, und sie würden mitlachen, vielleicht waren es Dienstmänner von der Straßenecke, sie sahen ihnen nicht unähnlich - trotzdem war er diesmal, förmlich schon seit dem ersten Anblick des Wächters Franz, entschlossen, nicht den geringsten Vorteil, den er vielleicht gegenüber diesen Leuten besaß, aus der Hand zu geben. Darin, daß man später sagen würde, er habe keinen Spaß verstanden, sah K. eine ganz geringe Gefahr, wohl aber erinnerte er sich - ohne daß es sonst seine Gewohnheit gewesen wäre, aus Erfahrungen zu lernen - an einige, an sich unbedeutende Fälle, in denen er zum Unterschied von seinen Freunden mit Bewußtsein, ohne das geringste Gefühl für die möglichen Folgen, sich unvorsichtig benommen hatte und dafür durch das Ergebnis gestraft worden war. Es sollte nicht wieder geschehen, zumindest nicht diesmal; war es eine Komödie, so wollte er mitspielen. + +Noch war er frei. "Erlauben Sie", sagte er und ging eilig zwischen den Wächtern durch in sein Zimmer. "Er scheint vernünftig zu sein", hörte er hinter sich sagen. In seinem Zimmer riß er gleich die Schubladen des Schreibtischs auf, es lag dort alles in großer Ordnung, aber gerade die Legitimationspapiere, die er suchte, konnte er in der Aufregung nicht gleich finden. Schließlich fand er seine Radfahrlegitimation und wollte schon mit ihr zu den Wächtern gehen, dann aber schien ihm das Papier zu geringfügig und er suchte weiter, bis er den Geburtsschein fand. Als er wieder in das Nebenzimmer zurückkam, öffnete sich gerade die gegenüberliegende Tür und Frau Grubach wollte dort eintreten. Man sah sie nur einen Augenblick, denn kaum hatte sie K. erkannt, als sie offenbar verlegen wurde, um Verzeihung bat, verschwand und äußerst vorsichtig die Tür schloß. "Kommen Sie doch herein", hatte K. gerade noch sagen können. Nun aber stand er mit seinen Papieren in der Mitte des Zimmers, sah noch auf die Tür hin, die sich nicht wieder öffnete, und wurde erst durch einen Anruf der Wächter aufgeschreckt, die bei dem Tischchen am offenen Fenster saßen und, wie K. jetzt erkannte, sein Frühstück verzehrten. "Warum ist sie nicht eingetreten?" fragte er. "Sie darf nicht", sagte der große Wächter. "Sie sind doch verhaftet." "Wie kann ich denn verhaftet sein? Und gar auf diese Weise?" "Nun fangen Sie also wieder an", sagte der Wächter und tauchte ein Butterbrot ins Honigfäßchen. "Solche Fragen beantworten wir nicht." "Sie werden sie beantworten müssen", sagte K. "Hier sind meine Legitimationspapiere, zeigen Sie mir jetzt die Ihrigen und vor allem den Verhaftbefehl." "Du lieber Himmel!" sagte der Wächter. "Daß Sie sich in Ihre Lage nicht fügen können und daß Sie es darauf angelegt zu haben scheinen, uns, die wir Ihnen jetzt wahrscheinlich von allen Ihren Mitmenschen am nächsten stehen, nutzlos zu reizen!" "Es ist so, glauben Sie es doch", sagte Franz, führte die Kaffeetasse, die er in der Hand hielt, nicht zum Mund, sondern sah K. mit einem langen, wahrscheinlich bedeutungsvollen, aber unverständlichen Blick an. K. ließ sich, ohne es zu wollen, in ein Zwiegespräch der Blicke mit Franz ein, schlug dann aber doch auf seine Papiere und sagte: "Hier sind meine Legitimationspapiere." "Was kümmern uns denn die?" rief nun schon der große Wächter. "Sie führen sich ärger auf als ein Kind. Was wollen Sie denn? Wollen Sie Ihren großen, verfluchten Prozeß dadurch zu einem raschen Ende bringen, daß Sie mit uns, den Wächtern, über Legitimation und Verhaftbefehl diskutieren? Wir sind niedrige Angestellte, die sich in einem Legitimationspapier kaum auskennen und die mit Ihrer Sache nichts anderes zu tun haben, als daß sie zehn Stunden täglich bei Ihnen Wache halten und dafür bezahlt werden. Das ist alles, was wir sind, trotzdem aber sind wir fähig, einzusehen, daß die hohen Behörden, in deren Dienst wir stehen, ehe sie eine solche Verhaftung verfügen, sich sehr genau über die Gründe der Verhaftung und die Person des Verhafteten unterrichten. Es gibt darin keinen Irrtum. Unsere Behörde, soweit ich sie kenne, und ich kenne nur die niedrigsten Grade, sucht doch nicht etwa die Schuld in der Bevölkerung, sondern wird, wie es im Gesetz heißt, von der Schuld angezogen und muß uns Wächter ausschicken. Das ist Gesetz. Wo gäbe es da einen Irrtum?" "Dieses Gesetz kenne ich nicht", sagte K. "Desto schlimmer für Sie", sagte der Wächter. "Es besteht wohl auch nur in Ihren Köpfen", sagte K., er wollte sich irgendwie in die Gedanken der Wächter einschleichen, sie zu seinen Gunsten wenden oder sich dort einbürgern. Aber der Wächter sagte nur abweisend: "Sie werden es zu fühlen bekommen." Franz mischte sich ein und sagte: "Sieh, Willem, er gibt zu, er kenne das Gesetz nicht, und behauptet gleichzeitig, schuldlos zu sein." "Du hast ganz recht, aber ihm kann man nichts begreiflich machen", sagte der andere. K. antwortete nichts mehr; muß ich, dachte er, durch das Geschwätz dieser niedrigsten Organe - sie geben selbst zu, es zu sein - mich noch mehr verwirren lassen? Sie reden doch jedenfalls von Dingen, die sie gar nicht verstehen. Ihre Sicherheit ist nur durch ihre Dummheit möglich. Ein paar Worte, die ich mit einem mir ebenbürtigen Menschen sprechen werde, werden alles unvergleichlich klarer machen als die längsten Reden mit diesen. Er ging einige Male in dem freien Raum des Zimmers auf und ab, drüben sah er die alte Frau, die einen noch viel älteren Greis zum Fenster gezerrt hatte, den sie umschlungen hielt. K. mußte dieser Schaustellung ein Ende machen: "Führen Sie mich zu Ihrem Vorgesetzten", sagte er. "Wenn er es wünscht; nicht früher", sagte der Wächter, der Willem genannt worden war. "Und nun rate ich Ihnen", fügte er hinzu, "in Ihr Zimmer zu gehen, sich ruhig zu verhalten und darauf zu warten, was über Sie verfügt werden wird. Wir raten Ihnen, zerstreuen Sie sich nicht durch nutzlose Gedanken, sondern sammeln Sie sich, es werden große Anforderungen an Sie gestellt werden. Sie haben uns nicht so behandelt, wie es unser Entgegenkommen verdient hätte, Sie haben vergessen, daß wir, mögen wir auch sein was immer, zumindest jetzt Ihnen gegenüber freie Männer sind, das ist kein kleines Übergewicht. Trotzdem sind wir bereit, falls Sie Geld haben, Ihnen ein kleines Frühstück aus dem Kaffeehaus drüben zu bringen." + +Ohne auf dieses Angebot zu antworten, stand K. ein Weilchen lang still. Vielleicht würden ihn die beiden, wenn er die Tür des folgenden Zimmers oder gar die Tür des Vorzimmers öffnete, gar nicht zu hindern wagen, vielleicht wäre es die einfachste Lösung des Ganzen, daß er es auf die Spitze trieb. Aber vielleicht würden sie ihn doch packen und, war er einmal niedergeworfen, so war auch alle Überlegenheit verloren, die er jetzt ihnen gegenüber in gewisser Hinsicht doch wahrte. Deshalb zog er die Sicherheit der Lösung vor, wie sie der natürliche Verlauf bringen mußte, und ging in sein Zimmer zurück, ohne daß von seiner Seite oder von Seite der Wächter ein weiteres Wort gefallen wäre. + +Er warf sich auf sein Bett und nahm vom Waschtisch einen schönen Apfel, den er sich gestern abend für das Frühstück vorbereitet hatte. Jetzt war er sein einziges Frühstück und jedenfalls, wie er sich beim ersten großen Bissen versicherte, viel besser, als das Frühstück aus dem schmutzigen Nachtcafé gewesen wäre, das er durch die Gnade der Wächter hätte bekommen können. Er fühlte sich wohl und zuversichtlich, in der Bank versäumte er zwar heute vormittag seinen Dienst, aber das war bei der verhältnismäßig hohen Stellung, die er dort einnahm, leicht entschuldigt. Sollte er die wirkliche Entschuldigung anführen? Er gedachte es zu tun, Würde man ihm nicht glauben, was in diesem Fall begreiflich war, so konnte er Frau Grubach als Zeugin führen oder auch die beiden Alten von drüben, die wohl jetzt auf dem Marsch zum gegenüberliegenden Fenster waren. Es wunderte K., wenigstens aus dem Gedankengang der Wächter wunderte es ihn, daß sie ihn in das Zimmer getrieben und ihn hier allein gelassen hatten, wo er doch zehnfache Möglichkeit hatte, sich umzubringen. Gleichzeitig allerdings fragte er sich, diesmal aus seinem Gedankengang, was für einen Grund er haben könnte, es zu tun. Etwa weil die zwei nebenan saßen und sein Frühstück abgefangen hatten? Es wäre so sinnlos gewesen, sich umzubringen, daß er, selbst wenn er es hätte tun wollen, infolge der Sinnlosigkeit dazu nicht imstande gewesen wäre. Wäre die geistige Beschränktheit der Wächter nicht so auffallend gewesen, so hätte man annehmen können, daß auch sie, infolge der gleichen Überzeugung, keine Gefahr darin gesehen hätten, ihn allein zu lassen. Sie mochten jetzt, wenn sie wollten, zusehen, wie er zu einem Wandschränkchen ging, in dem er einen guten Schnaps aufbewahrte, wie er ein Gläschen zuerst zum Ersatz des Frühstücks leerte und wie er ein zweites Gläschen dazu bestimmte, sich Mut zu machen, das letztere nur aus Vorsicht für den unwahrscheinlichen Fall, daß es nötig sein sollte. + + diff --git a/Input_und_Output_013/readme.md b/Input_und_Output_013/readme.md new file mode 100644 index 0000000..457c146 --- /dev/null +++ b/Input_und_Output_013/readme.md @@ -0,0 +1,26 @@ +# `Reader` verwenden +## Lernziel + + + +Textdaten mithilfe von `Reader` verarbeiten. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.reader_writer](../sources/src/main/java/pr2/io/reader_writer/). + +Lesen Sie die Datei [kafka.txt](../sources/src/main/resources/pr2/io/reader_writer/kafka.txt) mit einem passenden `Reader` ein und geben Sie sie auf der Konsole aus. Verwenden Sie nicht die `read()`-Methode, die einzelne Zeichen verarbeitet, sondern arbeiten Sie mit einem `char[]`-Buffer. + + + \ No newline at end of file diff --git a/Input_und_Output_014/readme.md b/Input_und_Output_014/readme.md new file mode 100644 index 0000000..4b37ead --- /dev/null +++ b/Input_und_Output_014/readme.md @@ -0,0 +1,36 @@ +# Rot13-Verschlüsselung +## Lernziel + + + +Funktionsweise und Einsatz von Filtern. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.rot13](../sources/src/main/java/pr2/io/rot13/). + +Schreiben Sie eine Klasse `Rot13Reader`, die als Filter-Reader implementiert ist und jedes eingelesene Zeichen durch ein Zeichen ersetzt, dessen numerischer Wert um 13 höher ist (d.h. um 13 Schritte im Alphabet verschoben ist). + +Schreiben Sie eine Klasse `Rot13`, die einen Dateinamen von der Kommandozeile nimmt und diese Text-Datei mithilfe von `Rot13Reader` liest und auf der Konsole ausgibt. + +```console +> cat /tmp/test +DIES IST EIN TEXT, DER GLEICH ROT13 VERSCHLUESSELT WIRD. + +> java Rot13 /tmp/test +QVR`-V`a-RV[-aRea9-QR_-TYRVPU-_\a>@-cR_`PUYbR``RYa-dV_Q; +``` + + + \ No newline at end of file diff --git a/Input_und_Output_015/readme.md b/Input_und_Output_015/readme.md new file mode 100644 index 0000000..c21c74a --- /dev/null +++ b/Input_und_Output_015/readme.md @@ -0,0 +1,39 @@ +# Datei zerhacken +## Lernziel + + + +Daten byteweise aus einem Stream lesen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.scrambler](../sources/src/main/java/pr2/io/scrambler/). + +Schreiben Sie eine Klasse `Scrambler`, die einen Dateinamen von der Kommandozeile entgegennimmt, die Datei einliest und dann wieder auf der Konsole ausgibt. Allerdings soll bei der Ausgabe nur jedes zweite Byte berücksichtigt werden. + +```console +> java Scrambler ../src/Scrambler.java +motjv.oFlIpttem +motjv.oFlNtonEcpin +motjv.oIEcpin +pbi ls cabe + pbi ttcvi anSrn[ rs hosIEcpin{ i ag.egh! ){ Sse.r.rnl( + Bteen ae nee"; Sse.xt1; } + ienuSra i; + r + i e ienuSra(rs0) +``` + + + \ No newline at end of file diff --git a/Input_und_Output_016/readme.md b/Input_und_Output_016/readme.md new file mode 100644 index 0000000..3c38348 --- /dev/null +++ b/Input_und_Output_016/readme.md @@ -0,0 +1,34 @@ +# Serialisierung +## Lernziel + + + +Serialisierung einsetzen können, um Objekte zu persistieren und wieder zu laden. + +## Aufgabe + +Gehen Sie in das Paket [pr2.io.serialisierung](../sources/src/main/java/pr2/io/serialisierung/). + +In dieser Aufgabe finden Sie bereits eine fertig implementierte Klasse `Board` vor, die ein Schachbrett repräsentiert. Allerdings wird dieses nicht für Schach benutzt, sondern für ein Spiel, bei dem man nur schwarze und weiße Steine auf das Brett stellen kann (z.B. Dame). Die Farbe der Steine wird durch die Enumeration `Color` dargestellt. + +Was bei dem Schachbrett allerdings noch fehlt, ist eine Möglichkeit den Spielstand zu speichern und später wieder einzulesen. + +Schauen Sie sich die Klassen `Board` und `Color` genau an und versuchen Sie diese zu verstehen. Sie können auch testweise ein Brett anlegen und mit Daten befüllen. (Wie dies geht, sehen Sie im JUnit-Test). Die `toString()`-Methode liefert eine anschauliche Darstellung des Spielfeldes. + +Implementieren Sie nun die Methoden `writeToFile` und `loadFromFile` unter Zuhilfenahme von Serialisierung. D.h. anders als in der Aufgabe zu `DataOutputStream`, sollen Sie hier kein eigenes Datenformat implementieren. Verwenden Sie stattdessen einen `ObjectOutputStream` bzw. `ObjectInputStream`. + +Lassen Sie den JUnit-Test laufen, um zu sehen, ob die Daten korrekt verarbeitet werden. Die Test-Datei für den Unit-Test ist [testdata.dat](../sources/src/main/resources/pr2/io/serialisierung/testdata.dat) + + + \ No newline at end of file diff --git a/Input_und_Output_016/testdata.dat b/Input_und_Output_016/testdata.dat new file mode 100644 index 0000000000000000000000000000000000000000..34b842b77598dd72c757803d410c2729263b1cda GIT binary patch literal 443 zcmZ4UmVvdnh(W5PAXP6jU#~c|C^Io9vnsJ9Ge1wyDL=6&h2`3m3u~C52Bdq3_23$uSE{B6{0GbH~LO=_O82GXh%M$f+67$maT=PnEktGXC z7+9Tr9G$)E3K{Ac*nzxo56=+S0uTU+aF&8dR-hIRuozg78;cA`h#RN`T|I^fR3Sli NC}x2z1UUf80046Cg8u*j literal 0 HcmV?d00001 diff --git a/Object_und_Wrapper_001/readme.md b/Object_und_Wrapper_001/readme.md new file mode 100644 index 0000000..de42507 --- /dev/null +++ b/Object_und_Wrapper_001/readme.md @@ -0,0 +1,26 @@ +# Deep-Copy mit `clone()` +## Lernziel + + + +Den Nutzen der `clone()`-Methode verstehen und diese richtig einsetzen. Eine eigene `clone()`-Methode schreiben und eine tiefe Kopie durchführen. + +## Aufgabe + +Im Paket [pr2.object.clone_alien](../sources/src/main/java/pr2/object/clone_alien/) fügen Sie der Klasse `Alien` eine `clone()`-Methode hinzu, die eine _tiefe Kopie_ der Objekte anlegt. Hierzu müssen Sie auch Raumanzug mit einer `clone()`-Methode ausstatten. + +Testen Sie, ob Ihre Implementierung korrekt funktioniert, indem Sie die vorhandenen Testfälle ausführen. Damit die Tests laufen können, müssen Sie die Kommentarzeichen entfernen. + + + \ No newline at end of file diff --git a/Object_und_Wrapper_002/readme.md b/Object_und_Wrapper_002/readme.md new file mode 100644 index 0000000..d2f43b5 --- /dev/null +++ b/Object_und_Wrapper_002/readme.md @@ -0,0 +1,26 @@ +# Clone +## Lernziel + + + +Den Nutzen der `clone()`-Methode verstehen und diese richtig einsetzen. Eine eigene `clone()`-Methode schreiben und eine tiefe Kopie durchführen. + +## Aufgabe + +Im Paket [pr2.object.clone_person](../sources/src/main/java/pr2/object/clone_person) finden Sie die Klasse `Person`. + +Erweitern Sie die Klasse bitte um eine `clone()`-Methode, die eine tiefe Kopie (**deep copy**) durchführt. + + + \ No newline at end of file diff --git a/Object_und_Wrapper_003/readme.md b/Object_und_Wrapper_003/readme.md new file mode 100644 index 0000000..337ee9e --- /dev/null +++ b/Object_und_Wrapper_003/readme.md @@ -0,0 +1,32 @@ +# `equals()` und `hashCode()` implementieren und nutzen +## Lernziel + + + +Die Methoden `equals()` und `hashCode()` der Klasse `Object` korrekt überschreiben und nutzen. + +## Aufgabe + +Im Projekt finden Sie ein Paket [pr2.object.equals_hashcode](../sources/src/main/java/pr2/object/equals_hashcode/) mit zwei Klassen `Wesen` und `Ork` und einen Testfall `WesenTest`. + +Wenn Sie den Test ausführen wird er nicht erfolgreich sein, da die Methoden `equals` und `hashCode` in der Klasse Ork fehlen. + +Schauen Sie sich die `equals`- und `hashCode`-Methoden in `Wesen` an und versuchen Sie die Methoden zu verstehen. + +Schreiben Sie im nächsten Schritt korrekte `equals`- und `hashCode`-Methoden für `Ork`. __Achtung:__ Sie sollten für Ihre Lösung die Klasse `Wesen` nicht verändern. + +Führen Sie den Test erneut aus, um sicherzustellen, dass die Methoden richtig funktionieren. + + + \ No newline at end of file diff --git a/Object_und_Wrapper_004/readme.md b/Object_und_Wrapper_004/readme.md new file mode 100644 index 0000000..cebe590 --- /dev/null +++ b/Object_und_Wrapper_004/readme.md @@ -0,0 +1,26 @@ +# equals und hashCode +## Lernziel + + + +Die Methoden `equals()` und `hashCode()` der Klasse `Object` korrekt überschreiben und nutzen. + +## Aufgabe + +Im Paket [pr2.object.equals_person](../sources/src/main/java/pr2/object/equals_person) finden Sie die Klasse `Person`. + +Geben Sie bitte den Java-Quelltext einer `equals`- und `hashCode`-Methode für diese Klasse an, die die in der Klasse `java.lang.Object` zugesicherte Äquivalenzbeziehung einhalten. + + + \ No newline at end of file diff --git a/Object_und_Wrapper_005/readme.md b/Object_und_Wrapper_005/readme.md new file mode 100644 index 0000000..5b276d3 --- /dev/null +++ b/Object_und_Wrapper_005/readme.md @@ -0,0 +1,38 @@ +# `toString()`-Methode implementieren +## Lernziel + + + +Klassen mit einer `toString()`-Methode versehen und diese gegenseitig nutzen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.object.tostring](../sources/src/main/java/pr2/object/tostring/). + +Lassen Sie die Klasse `Ausgabe` laufen und sehen Sie sich die Ausgabe an. Versuchen Sie zu verstehen, wie es zu dieser Ausgabe kommt und was sie bedeutet. + +Schreiben Sie im nächsten Schritt für die Klassen `Alien` und `Raumanzug` passende `toString()`-Methoden, sodass beim Aufruf der Klasse `Ausgabe` eine sinnvolle Ausgabe entsteht. Geben Sie + + * den Namen des Aliens, + * die Marke des Raumanzuges und + * den vorhandenen Sauerstoffvorrat + +aus. + +Eine beispielhafte Ausgabe könnte wie folgt aussehen: + +`Ich bin ein Alien und heiße 'E.T.'. Ich trage einen Raumanzug von Spaceman 2000 (Füllstand 19%).` + + + \ No newline at end of file diff --git a/Object_und_Wrapper_006/readme.md b/Object_und_Wrapper_006/readme.md new file mode 100644 index 0000000..b82c722 --- /dev/null +++ b/Object_und_Wrapper_006/readme.md @@ -0,0 +1,28 @@ +# Optimierung bei Integer +## Lernziel + + + +Wrapper-Klassen und deren Optimierungen verstehen. + +## Aufgabe + +Gehen Sie in das Paket [pr2.object.wrapper_boxsearch](../sources/src/main/java/pr2/object/wrapper_boxsearch/). + +Bei den Wrapper-Typen (z.B. `Integer`) wird eine interne Optimierung durchgeführt, die dazu führt, dass bei Werten unterhalb einer bestimmten Schranke, beim Autoboxing immer wieder dasselbe Objekt verwendet wird, anstatt ein neues Wrapper-Objekt zu erzeugten. + +Schreiben Sie bitte ein Programm in der Klasse `BoxSearcher`, das für `Integer` diese Schranke sucht, indem es die Werte von `0` bis `200` auf diese Eigenschaft hin untersucht und für jeden Integer-Wert ausgibt, ob der Mechanismus bei ihm greift oder nicht. + + + \ No newline at end of file diff --git a/Object_und_Wrapper_007/readme.md b/Object_und_Wrapper_007/readme.md new file mode 100644 index 0000000..ed49b9f --- /dev/null +++ b/Object_und_Wrapper_007/readme.md @@ -0,0 +1,39 @@ +# Methoden der Wrapper-Klassen +## Lernziel + + + +Wrapper-Klassen nutzen, um Zahlen umzuwandeln. + +## Aufgabe + +Gehen Sie in das Paket [pr2.object.wrapper_umwandler](../sources/src/main/java/pr2/object/wrapper_umwandler/). + +Vervollständigen Sie die Klasse `Umwandler` so, dass die Methode `toString` eine Zahl nimmt und in vier verschiedenen Formaten ausgibt. Schauen Sie sich die Klasse `Integer` an und überlegen Sie, welche der vorhandenen statischen Methoden für das Problem passend sein könnten. + +Eine beispielhafte könnte wie folgt aussehen: + +```console +Dezimal: 17871 +Hex : 45cf +Oktal : 42717 +Binär : 100010111001111 +``` + +Im nächsten Schritt stellen Sie bitte die Methode `fromString` fertig. Auch hierzu sollten Sie sich die Klasse `Integer` genauer anschauen. + +Führen Sie das Programm aus und schauen Sie, ob das Ergebnis sinnvoll ist. + + + \ No newline at end of file diff --git a/readme.md b/readme.md index 3e8d225..a85d457 100644 --- a/readme.md +++ b/readme.md @@ -18,9 +18,9 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat | 4. | Auffrischung | [printf mit Formatstring](Auffrischung_004/readme.md) | | 5. | Auffrischung | [Maximum in einem Array suchen](Auffrischung_005/readme.md) | | 6. | Auffrischung | [Taschenrechner](Auffrischung_006/readme.md) | -| 7. | Einführung | [Java-Coding-Standard anwenden](Einführung_001/readme.md) | -| 8. | Einführung | [JavaDoc schreiben](Einführung_002/readme.md) | -| 9. | Einführung | [Klasse mit JUnit testen](Einführung_003/readme.md) | +| 7. | Einführung | [Java-Coding-Standard anwenden](Einfuehrung_001/readme.md) | +| 8. | Einführung | [JavaDoc schreiben](Einfuehrung_002/readme.md) | +| 9. | Einführung | [Klasse mit JUnit testen](Einfuehrung_003/readme.md) | | 10. | Strukturierung | [Information-Hiding einer Klasse verbessern](Strukturierung_001/readme.md) | | 11. | Strukturierung | [Vorhandene Bibliotheken als JAR einbinden](Strukturierung_002/readme.md) | | 12. | Vererbung | [Final anwenden](Vererbung_001/readme.md) | @@ -35,19 +35,19 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat | 21. | Vererbung | [Methoden überschreiben](Vererbung_010/readme.md) | | 22. | Vererbung | [Varag-Methode schreiben](Vererbung_011/readme.md) | | 23. | Vererbung | [Vererbung von Figuren](Vererbung_012/readme.md) | -| 24. | Abstrakte Klassen | [Abstrakte Klassen](Abstrakte Klassen_001/readme.md) | -| 25. | Abstrakte Klassen | [Abstrakte Klasse](Abstrakte Klassen_002/readme.md) | +| 24. | Abstrakte Klassen | [Abstrakte Klassen](Abstrakte_Klassen_001/readme.md) | +| 25. | Abstrakte Klassen | [Abstrakte Klasse](Abstrakte_Klassen_002/readme.md) | | 26. | Interfaces | [Comparable implementieren](Interfaces_001/readme.md) | | 27. | Interfaces | [Interface Stack entwerfen](Interfaces_002/readme.md) | | 28. | Interfaces | [Interface: Uebersetzer](Interfaces_003/readme.md) | | 29. | Interfaces | [Interfaces anwenden und entwerfen](Interfaces_004/readme.md) | -| 30. | Object und Wrapper | [Deep-Copy mit `clone()`](Object und Wrapper_001/readme.md) | -| 31. | Object und Wrapper | [Clone](Object und Wrapper_002/readme.md) | -| 32. | Object und Wrapper | [`equals()` und `hashCode()` implementieren und nutzen](Object und Wrapper_003/readme.md) | -| 33. | Object und Wrapper | [equals und hashCode](Object und Wrapper_004/readme.md) | -| 34. | Object und Wrapper | [`toString()`-Methode implementieren](Object und Wrapper_005/readme.md) | -| 35. | Object und Wrapper | [Optimierung bei Integer](Object und Wrapper_006/readme.md) | -| 36. | Object und Wrapper | [Methoden der Wrapper-Klassen](Object und Wrapper_007/readme.md) | +| 30. | Object und Wrapper | [Deep-Copy mit `clone()`](Object_und_Wrapper_001/readme.md) | +| 31. | Object und Wrapper | [Clone](Object_und_Wrapper_002/readme.md) | +| 32. | Object und Wrapper | [`equals()` und `hashCode()` implementieren und nutzen](Object_und_Wrapper_003/readme.md) | +| 33. | Object und Wrapper | [equals und hashCode](Object_und_Wrapper_004/readme.md) | +| 34. | Object und Wrapper | [`toString()`-Methode implementieren](Object_und_Wrapper_005/readme.md) | +| 35. | Object und Wrapper | [Optimierung bei Integer](Object_und_Wrapper_006/readme.md) | +| 36. | Object und Wrapper | [Methoden der Wrapper-Klassen](Object_und_Wrapper_007/readme.md) | | 37. | Enumerationen | [Eigene Enumeration schreiben und verwenden](Enumerationen_001/readme.md) | | 38. | Enumerationen | [Enumeration schreiben](Enumerationen_002/readme.md) | | 39. | Enumerationen | [Singleton-Eigenschaft von Enumerationen](Enumerationen_003/readme.md) | @@ -57,37 +57,37 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat | 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | | 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | | 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | -| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input und Output_001/readme.md) | -| 47. | Input und Output | [DataOutputStream](Input und Output_002/readme.md) | -| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input und Output_003/readme.md) | -| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input und Output_004/readme.md) | -| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input und Output_005/readme.md) | -| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input und Output_006/readme.md) | -| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input und Output_007/readme.md) | -| 53. | Input und Output | [Fileattribute lesen](Input und Output_008/readme.md) | -| 54. | Input und Output | [`FilterReader`](Input und Output_009/readme.md) | -| 55. | Input und Output | [Konsolen Input/Output](Input und Output_010/readme.md) | -| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input und Output_011/readme.md) | -| 57. | Input und Output | [`RandomAccessFile`](Input und Output_012/readme.md) | -| 58. | Input und Output | [`Reader` verwenden](Input und Output_013/readme.md) | -| 59. | Input und Output | [Rot13-Verschlüsselung](Input und Output_014/readme.md) | -| 60. | Input und Output | [Datei zerhacken](Input und Output_015/readme.md) | -| 61. | Input und Output | [Serialisierung](Input und Output_016/readme.md) | -| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische Typen_001/readme.md) | -| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische Typen_002/readme.md) | -| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische Typen_003/readme.md) | -| 65. | Generische Typen | [Generische Klasse Pair erweitern: SamePair](Generische Typen_004/readme.md) | -| 66. | Generische Typen | [PairList](Generische Typen_005/readme.md) | -| 67. | Generische Typen | [Wildcard benutzen](Generische Typen_006/readme.md) | -| 68. | Generische Typen | [Generische Queue](Generische Typen_007/readme.md) | -| 69. | Generische Typen | [`super` und `extends` einsetzen](Generische Typen_008/readme.md) | -| 70. | Generische Typen | [Generische Typen zusammen mit Wildcards einsetzen](Generische Typen_009/readme.md) | -| 71. | Geschachtelte Klassen | [Eigene compare-Methode schreiben](Geschachtelte Klassen_001/readme.md) | -| 72. | Geschachtelte Klassen | [Innere Klasse Beobachter](Geschachtelte Klassen_002/readme.md) | -| 73. | Geschachtelte Klassen | [Callback mit anonymer Klasse realisieren](Geschachtelte Klassen_003/readme.md) | +| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | +| 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | +| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | +| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | +| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | +| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | +| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | +| 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | +| 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | +| 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | +| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | +| 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | +| 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | +| 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | +| 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | +| 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | +| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | +| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | +| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | +| 65. | Generische Typen | [Generische Klasse Pair erweitern: SamePair](Generische_Typen_004/readme.md) | +| 66. | Generische Typen | [PairList](Generische_Typen_005/readme.md) | +| 67. | Generische Typen | [Wildcard benutzen](Generische_Typen_006/readme.md) | +| 68. | Generische Typen | [Generische Queue](Generische_Typen_007/readme.md) | +| 69. | Generische Typen | [`super` und `extends` einsetzen](Generische_Typen_008/readme.md) | +| 70. | Generische Typen | [Generische Typen zusammen mit Wildcards einsetzen](Generische_Typen_009/readme.md) | +| 71. | Geschachtelte Klassen | [Eigene compare-Methode schreiben](Geschachtelte_Klassen_001/readme.md) | +| 72. | Geschachtelte Klassen | [Innere Klasse Beobachter](Geschachtelte_Klassen_002/readme.md) | +| 73. | Geschachtelte Klassen | [Callback mit anonymer Klasse realisieren](Geschachtelte_Klassen_003/readme.md) | | 74. | Lambdas | [Comparator als Lambda](Lambdas_001/readme.md) | | 75. | Lambdas | [Callback mit Lambda realisieren](Lambdas_002/readme.md) | -| 76. | Geschachtelte Klassen | [MatrixSuche](Geschachtelte Klassen_001/readme.md) | +| 76. | Geschachtelte Klassen | [MatrixSuche](Geschachtelte_Klassen_001/readme.md) | | 77. | Lambdas | [StringTransmogrifier](Lambdas_001/readme.md) | | 78. | Lambdas | [StringTransmogrifier erweitern](Lambdas_002/readme.md) | | 79. | Collections | [Iterator schreiben](Collections_001/readme.md) |