Programmieren mit Java IIhttp://sol.cs.hm.edu/4129Inhaltsverzeichnis
Inhaltsverzeichnis
Kurzes Inhaltsverzeichnis
Programmieren mit Java II Vorwort Inhaltsverzeichnis 1. Ein- und Ausgabe (I/O)2. Serialisierung3. XML4. Rekursion5. Geschachtelte Klassen6. Nebenläufigkeit7. Netzwerkprogrammierung8. Reflection9. AnnotationenA. VoraussetzungenB. I/O-PipelinesC. Beispiel Decorator-PatternD. Java-8-Entwicklerversion

Ausführlicheres Inhaltsverzeichnis
Programmieren mit Java II Abweichungen zwischen eBook und gedruckter Fassung Vorwort Inhalt Software Hinweise für Dozenten Hinweise für Studierende Webseite Lizenz Dank Inhaltsverzeichnis 1. Ein- und Ausgabe (I/O)Lernziele 1.1 Standardein- und -ausgabe 1.2 Byteströme 1.3 File-I/O 1.4 Transformationen mit Filterklassen 1.5 Decorator-Pattern 1.6 Umgang mit Textdateien 1.7 Definition neuer I/O-Klassen 1.8 Datei-Operationen und Directories Zusammenfassung Aufgaben 2. SerialisierungLernziele 2.1 Fragen 2.2 Object-Streams 2.3 JavaBeans 2.4 XStream Zusammenfassung Aufgaben 3. XMLLernziele 3.1 Struktur, Grammatik und Validierung 3.2 Arbeit mit dem DOM 3.3 SAX-Parser Zusammenfassung Aufgaben 4. RekursionLernziele 4.1 Arbeitsweise 4.2 Rekursion und Iteration 4.3 Klassifizierung 4.4 Anwendungen 4.5 Memoizing Zusammenfassung Aufgaben 5. Geschachtelte KlassenLernziele 5.1 Statisch geschachtelte Klassen 5.2 Innere Klassen 5.3 Lokale Klassen 5.4 Anonyme Klassen 5.5 Lambda-Ausdrücke (Java 8) 5.6 Default-Methoden (Java 8) Zusammenfassung Aufgaben 6. NebenläufigkeitLernziele 6.1 Paralleler Programmablauf 6.2 Kommunikation mit Interrupts 6.3 Scheduling und Multiprozessoren 6.4 Konkurrierender Zugriff und Synchronisation 6.5 volatile und Deadlocks 6.6 Bedingtes Warten Zusammenfassung Aufgaben 7. NetzwerkprogrammierungLernziele 7.1 Grundlagen 7.2 Clients und Server 7.3 HTML, HTTP und Webserver Zusammenfassung Aufgaben 8. ReflectionLernziele 8.1 Factory-Methoden 8.2 Analyse der Codestruktur 8.3 Analyse und Modifikation von Objekten Zusammenfassung Aufgaben 9. AnnotationenLernziele 9.1 Idee 9.2 Vordefinierte Annotationen 9.3 Neue Annotationen 9.4 Auswertung zur Laufzeit 9.5 Prozessoren 9.6 Packages Zusammenfassung Aufgaben A. VoraussetzungenB. I/O-PipelinesFilter C. Beispiel Decorator-PatternD. Java-8-EntwicklerversionD.1 Lambda-Ausdrücke D.2 Default-Methoden

Vollständiges Inhaltsverzeichnis
Programmieren mit Java II Abweichungen zwischen eBook und gedruckter Fassung Vorwort Inhalt Software Hinweise für Dozenten Hinweise für Studierende Webseite Lizenz Dank Inhaltsverzeichnis 1. Ein- und Ausgabe (I/O)Lernziele 1.1 Standardein- und -ausgabe 1.1.1 Vordefinierte I/O-Objekte 1.1.2 Redirection Eingabe-Umlenkung Ausgabe-Umlenkung Ein- und Ausgabe-Umlenkung 1.1.3 Standard-Fehlerausgabe 1.2 Byteströme 1.2.1 Abstrakte Basisklassen 1.2.2 Lesen und Schreiben Blockierende Aufrufe Exceptions 1.2.3 Pufferung 1.2.4 Schließen von Streams 1.2.5 ARM Interfaces AutoCloseable und Closeable 1.3 File-I/O 1.3.1 Konkrete Datenquellen und -senken 1.3.2 Filestreams Konstruktoren Betriebssystem-Abhängigkeiten Pfadtrenner Verlängern von Dateien 1.3.3 Blockweise Übertragung 1.3.4 Abstrakte und konkrete Methoden 1.4 Transformationen mit Filterklassen 1.4.1 Ableitung und Komposition Filterketten 1.4.2 Abstrakte Filterklassen 1.4.3 Konkrete Filterklassen 1.4.4 Filter der Laufzeitbibliothek BufferedStreams DataStreams GZIPStreams 1.4.5 Zip-Dateien 1.5 Decorator-Pattern 1.6 Umgang mit Textdateien 1.6.1 Interne und externe Darstellung 1.6.2 Basisklassen Reader und Writer 1.6.3 Konkrete Quellen und Senken 1.6.4 Textfilter Zeilenweise Eingabe Ausgabe der Textdarstellung 1.6.5 Ersetzen der Standardein- und -ausgabe-Objekte 1.6.6 Zeichensätze und Encodings Brückenklassen Encoding von Strings 1.7 Definition neuer I/O-Klassen NullOutputStream FailingReader CesarCipherWriter DetabReader EntabWriter 1.8 Datei-Operationen und Directories 1.8.1 Datei-Objekte 1.8.2 Eigenschaften von Dateien Filesystem-spezifische Attribute 1.8.3 Zugriffsrechte 1.8.4 Pfade Einzelne Pfadelemente Gekürzte, absolute und relative Pfade 1.8.5 Directories Rekursiver Directorydurchlauf 1.8.6 Schreiben und Lesen Factory-Methoden für I/O-Klassen 1.8.7 Filesystem-Operationen Zusammenfassung Aufgaben Aufgabe 1: Streams mit Methodenaufruf-Protokoll Aufgabe 2: Ausgabe mit Rücknahme Aufgabe 3: Streams mit natürlichen Zahlen Aufgabe 4: Stream-Iterator Aufgabe 5: File-Vergleich 2. SerialisierungLernziele 2.1 Fragen 2.2 Object-Streams 2.2.1 Methoden readObject und writeObject 2.2.2 Interface Serializable 2.2.3 Objektgraphen 2.2.4 Stream-Struktur 2.2.5 Aufruf von Konstruktoren 2.2.6 Cloning 2.2.7 Caching 2.2.8 Nicht serialisierte Variablen 2.2.9 Serialisierungsversionen 2.2.10 Eingriff in die Serialisierung 2.3 JavaBeans 2.3.1 Properties 2.3.2 XMLEncoder und XMLDecoder 2.3.3 Speicherformat XML 2.3.4 Inkonsistenzen 2.3.5 Objektgraphen 2.3.6 Serialisierer-Objekte 2.3.7 Neue Serialisierer 2.3.8 Deserialisierung 2.4 XStream 2.4.1 toXML und fromXML 2.4.2 Referenzen 2.4.3 Converter 2.4.4 Neue Converter, statische und transiente Variablen 2.4.5 Encoding 2.4.6 Kompatibilität mit Object-Streams Zusammenfassung Aufgaben Aufgabe 1: Serialisierte Pizzas Aufgabe 2: Pizzas als JavaBeans Aufgabe 3: Pizzas via XStream 3. XMLLernziele 3.1 Struktur, Grammatik und Validierung 3.1.1 Aufbau eines XML-Dokuments Knoten und Elemente Dokument und Deklaration Attribute Ersatzdarstellungen Namespaces 3.1.2 Validierung DTD XML-Schema 3.2 Arbeit mit dem DOM 3.2.1 DOM-Parser 3.2.2 Validierung DTD XML-Schema 3.2.3 Objektbaum Interface Node Navigation im DOM Attribute Vereinfachtes DOM 3.2.4 Arbeiten mit dem DOM 3.2.5 Ausgabe 3.2.6 Modifikation Neue Knoten Knoten einbauen Manipulation der Baumstruktur Text und Attribute ändern Hilfsmethoden 3.2.7 Fehlerbehandlung 3.3 SAX-Parser 3.3.1 Initialisierung 3.3.2 Handler 3.3.3 Validierung DTD XML-Schema 3.3.4 Umgang mit Text characters-Handleraufrufe Whitespace 3.3.5 Fehlerbehandlung Zusammenfassung Aufgaben Aufgabe 1: Sortieren eines DOM Aufgabe 2: XML-Abbild eines Directorybaums Aufgabe 3: SAX-Parser 4. RekursionLernziele 4.1 Arbeitsweise 4.1.1 Selbstaufruf und Abbruchkriterium Endlosrekursion Abbruchbedingung Merkmale der Rekursion 4.1.2 Parameter und Ergebnis Inkarnationen von Parametern Ergebnisrückgabe Zahlensumme 4.1.3 Indirekte Rekursion 4.1.4 Laufzeitstack Stackframes Stacküberlauf 4.1.5 Rekursive Datenstrukturen 4.2 Rekursion und Iteration 4.2.1 Endrekursion Ergebnisparameter Transformationsschema Parallele Parameterzuweisungen 4.2.2 Eliminierung der Endrekursion 4.3 Klassifizierung 4.3.1 Lineare Rekursion Umformung in Iterationen 4.3.2 Verzweigte Rekursion Beispiel: Fibonaccizahlen Umformung in Iteration Vorwärtsberechnung der Fibonaccizahlen 4.3.3 Geschachtelte Rekursion Beispiel: Ackermann-Funktion Beispiel: Takeuchi-Funktion Umformung in Iteration 4.4 Anwendungen 4.4.1 Filesystem Rekursiver Durchlauf Trennung Durchlauf und Verarbeitung Löschen leerer Directories Doppelte Files 4.4.2 Parser 4.4.3 Permutationen 4.5 Memoizing 4.5.1 Redundante Methodenaufrufe Gedächtnis für Ergebnisse Globaler Cache Implementierung des Caches 4.5.2 Bedingungen für Memoizing 4.5.3 Implementierung von Caches Stack und Heap Garbage-Collector Explizite Garbage-Collection Referenzarten WeakHashMap als Cache Zusammenfassung Aufgaben Aufgabe 1: Zahlen-Eigenschaften Quersumme Primzahlen Perfekte Zahlen Fröhliche Zahlen Aufgabe 2: Hofstadter-Zahlenfolge Aufgabe 3: Beamtenhierarchie Aufgabe 4: Tiefe Map 5. Geschachtelte KlassenLernziele 5.1 Statisch geschachtelte Klassen 5.1.1 Definition und Syntax 5.1.2 Bedeutung von private 5.1.3 Anwendungsbeispiel: Factory-Methoden 5.1.4 Bytecode-Dateien 5.1.5 Statisch geschachtelte Interfaces 5.2 Innere Klassen 5.2.1 Anwendungsbeispiel: Iterierbare Strings 5.3 Lokale Klassen 5.4 Anonyme Klassen 5.4.1 Anwendungsbeispiele Comparator-Objekte Thread-Klassen Iterierbare Strings 5.5 Lambda-Ausdrücke (Java 8) 5.5.1 Funktionsinterfaces 5.5.2 Lambda-Ausdrücke Syntaktische Abkürzungen 5.5.3 Lambda-Ausdrücke im Typsystem 5.5.4 Closure 5.5.5 Gültigkeitsbereiche Bedeutung von this und super break und continue 5.5.6 Exceptions in einem Lambda-Ausdruck 5.5.7 Geschachtelte Lambda-Ausdrücke Lambda-Ausdruck als Ergebnis eines Lambda-Ausdrucks Lambda-Ausdruck als Argument eines Lambda-Ausdrucks 5.5.8 Funktionsinterfaces in der Bibliothek 5.6 Default-Methoden (Java 8) 5.6.1 Definition von Default-Methoden 5.6.2 Implementierung von Default-Methoden 5.6.3 Einschränkungen von Default-Methoden 5.6.4 Vererbung und Default-Methoden Konkurrierende Default-Methoden 5.6.5 Evolution von Interfaces 5.6.6 ABCs und Default-Methoden Zusammenfassung Aufgaben Aufgabe 1: Statische Factory Ableiten einer statisch geschachtelten Klasse Aufgabe 2: Teilmatrix Aufgabe 3: Anonyme Collection 6. NebenläufigkeitLernziele 6.1 Paralleler Programmablauf 6.1.1 Basisklasse Thread Thread-Methoden Begriff Thread 6.1.2 Start eines neuen Threads Selbststartende Threads 6.1.3 Eigenschaften von Threads Gepufferte Ausgabe Verzögerter Thread-Start Nicht deterministischer Ablauf run als normale Methode Mehrfacher Thread-Start 6.1.4 Ende eines Threads Methode join Methode isAlive 6.1.5 Interface Runnable 6.1.6 Threads am Programmende Daemon-Threads Methode exit 6.2 Kommunikation mit Interrupts 6.2.1 Interrupt-Flags 6.2.2 isInterrupted und interrupted 6.2.3 sleep und InterruptedException 6.3 Scheduling und Multiprozessoren 6.3.1 Lebenslauf eines Threads 6.3.2 Scheduler 6.3.3 Expliziter Zustandswechsel 6.3.4 Threads und Prozessoren CPUs und Cores Time-Slicing Performance-Beispiel 6.3.5 Hintergrund-Threads 6.3.6 Threads und Prozesse 6.4 Konkurrierender Zugriff und Synchronisation 6.4.1 Thread-lokale und geteilte Daten 6.4.2 Gleichzeitiger Zugriff 6.4.3 Zusammengesetzte Operationen synchronized-Block Monitor-Objekte 6.4.4 Synchronisation auf einem Monoprozessor 6.4.5 Atomare Operationen 6.4.6 Länge von synchronized-Blöcken Übersynchronisierung Minimale Synchronisation 6.4.7 synchronized-Methoden Statisch synchronisierte Methoden 6.5 volatile und Deadlocks 6.5.1 Anwendungsbeispiel Parkhaus 6.5.2 Optimierung von Variablenzugriffen 6.5.3 Modifier volatile Atomare Wertzuweisung 6.5.4 Deadlocks Regelmäßige Freigabe des Monitors Reihenfolge der Monitor-Belegung 6.5.5 Unveränderliche Klassen 6.6 Bedingtes Warten 6.6.1 Aktives Warten 6.6.2 wait und notify Minimalprogramm mit wait und notify 6.6.3 Test der wait-Bedingung 6.6.4 notify und notifyAll Zusammenfassung Aufgaben Aufgabe 1: Roboter am Fließband Wartende Roboter Programmende Aufgabe 2: Buchstaben-Ticker Synchronisation Erweiterung 7. NetzwerkprogrammierungLernziele 7.1 Grundlagen 7.1.1 ISO/OSI-Schichtenmodell 7.1.2 Protokollstapel 7.1.3 MAC-Adressen (Ethernet) 7.1.4 Hostadressen (IP) 7.1.5 Loopback-Device 7.1.6 Symbolische Hostnamen 7.1.7 Domainname-Server (DNS) 7.1.8 Ports 7.1.9 Dienste und Protokolle 7.1.10 Client-Server-Systeme 7.1.11 Peer-to-Peer-Netzwerke 7.2 Clients und Server 7.2.1 Sockets 7.2.2 Portscanner 7.2.3 Lesen und Schreiben 7.2.4 Beenden einer Verbindung 7.2.5 Pufferung 7.2.6 Beispiel: Echo-Client 7.2.7 Telnet-Client 7.2.8 Serversockets 7.2.9 Beispiele: Time- und Echo-Server 7.2.10 Verbindung auf einzelnen Netzwerkschnittstellen 7.2.11 Teilweiser Abbau 7.2.12 Verschlüsselte Verbindung 7.3 HTML, HTTP und Webserver 7.3.1 Idee 7.3.2 Webserver und Browser 7.3.3 URLs 7.3.4 HTML 7.3.5 DOM 7.3.6 Aufbau eines Dokuments 7.3.7 HTTP-Request 7.3.8 HTTP-Response Codegruppen 7.3.9 HTTP-Zugriff mit Bibliotheksklassen 7.3.10 Minimaler Webserver 7.3.11 Statischer Webserver 7.3.12 Dynamische Webseiten 7.3.13 Nebenläufiger Webserver 7.3.14 Gefährlicher dynamischer Server 7.3.15 Webserver-Basisklasse Zusammenfassung Aufgaben Aufgabe 1: Datei über das Netzwerk kopieren Arbeitsweise als Filter Kompression Flexibler Aufruf Aufgabe 2: Forwarder Test Aufgabe 3: Farbbild-Webserver 8. ReflectionLernziele 8.1 Factory-Methoden 8.1.1 Typobjekte und die Methode forName 8.1.2 Erzeugen von Objekten mit newInstance 8.1.3 Beispielanwendung: Pizzas 8.1.4 Konstruktor-Objekte 8.1.5 Beispielanwendung: Pizzas, weitere Verbesserung 8.2 Analyse der Codestruktur 8.2.1 Modifier 8.2.2 Konstruktoren 8.2.3 Variablen 8.2.4 Methoden 8.2.5 Anwendung: UML-artige Skizze einer Klassendefinition 8.3 Analyse und Modifikation von Objekten 8.3.1 Zugriff auf Variablen Freigabe des Zugriffs 8.3.2 Umgang mit Arrays 8.3.3 Verändern von Objekten 8.3.4 Anwendung: Reflektive toString-Methode 8.3.5 Reflektive Methodenaufrufe 8.3.6 Erzeugen neuer Objekte Zusammenfassung Aufgaben Aufgabe 1: Kontrolle der Standardein- und -ausgabe Aufgabe 2: Automatisches Pickup Aufgabe 3: Mock-Objekte Aufgabe 4: UMLet-Dateien 9. AnnotationenLernziele 9.1 Idee 9.2 Vordefinierte Annotationen 9.2.1 Warnungen des Java-Compilers 9.2.2 Annotation SafeVarargs 9.3 Neue Annotationen 9.3.1 Definition 9.3.2 Annotation-Werte 9.3.3 Meta-Annotation Target 9.3.4 Meta-Annotation Retention 9.3.5 Meta-Annotation Inherited und Documented 9.3.6 Marker-Annotationen 9.4 Auswertung zur Laufzeit 9.4.1 Anwendung: Reflektive toString-Methode Definition des Annotationtyps IntoString Auswertung durch Reflection Erweiterung auf Klassen-Annotation Einsatz von @Inherited 9.5 Prozessoren 9.5.1 Arbeitsweise Einfacher Prozessor Compileraufruf mit Annotationprozessor 9.5.2 Diagnoseausgabe des Compilers 9.5.3 Anwendung: Generierte Bean-Klassen 9.6 Packages Zusammenfassung Aufgaben Aufgabe 1: Mock-Klassen Aufgabe 2: Analyse der Codestruktur Aufgabe 3: Annotation-Attribute A. VoraussetzungenB. I/O-PipelinesFilter C. Beispiel Decorator-PatternD. Java-8-EntwicklerversionD.1 Lambda-Ausdrücke Test D.2 Default-Methoden Test