Java Grundkurs 3: Generische Programmierung, Datenströme, Datumsrechnung

Die Byte Stream API auf einen Blick

Testen Sie unsere 1983 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
In diesem Video erhalten Sie eine Einführung in die Byte Stream API, mit der Sie Datenströme Byte für Byte transportieren. Dabei lernen Sie die Klassen InputStream und OutputStream kennen.

Transkript

In diesem Video steigen wir gemeinsam in die Welt der Dateizugriffe mit Java ein. Allerdings gehe ich noch nicht auf die bereits sehr gut ausgebaute High Level API ein, sondern zeige Ihnen zunächst die Low Level API, bei der wir den Datei Zugriff mit einer Lupe betrachten. Denn dabei wird ersichtlich, dass es sich beispielsweise beim Einlesen aus einer Datei um einen Eingabestrom von Bytes handelt. Der englische Fachbegriff lautet Input Stream. Auch der Java Datentyp hierzu nennt sich Input Stream. Ich deklariere also eine Variable vom Typ InputStream. Und die nenne ich in und die Klasse muss ich importieren. Jetzt habe ich einen InputStream, also einen Eingabestrom und für die Ausgabe existiert auch ein Datentyp und der nennt sich OutputStream. Auch das deklariere ich hier oben unterhalb des InputStreams als Variable OutputStream. Das ist mein Datentyp. Und die Variable nenne ich out. Über einen InputStream werden Bytes also aus einer Quelle empfangen und über einen OutputStream werden die Bytes in ein Ziel hineingeschrieben. Dabei spielt es keine Rolle, ob es ich bei dem Byte-Strom um eine Datei, einen Bildschirm die Tastatur oder andre Peripheriegeräte handelt, denn Java behandelt die Kommunikation mit allen Medien in gleicher Weise. Wenn man also auf der Low Level Ebene programmiert, sind diese beiden Datentypen Input Stream und Output Stream von Bedeutung. Diese beiden grundlegenden Klassen befinden sich im Package Java.IO und dies ist schon von Beginn an so gewesen, also seit Java 1.0. Allerdings handelt es sich hierbei um abstrakte Oberklassen, die von speziellen Kinds-Klassen für jeweilige Zwecke überschrieben werden. Das schauen wir uns jetzt in Eclipse an. Hierfür klicken Sie mit der rechten Maustaste auf den Klassenbezeichner InputStream und dann öffnet sich ein Kontextmenü und im Kontextmenü wählen Sie den Eintrag Open Type Hierarchy. Und nun sehen Sie auf der linken Seite die Typ-Hierarchie der abstrakten Klasse Input Stream und wie man sieht, existieren für die jeweiligen Zwecke unterschiedliche Unter Klassen. Die Klasse InputStream ist also eine abstrakte Klasse, die als Vaterklasse die Methoden vorschreibt, die die unterschiedlichen Kindesklassen implementieren sollen. Hier unten sehen Sie die abstrakten Methoden, die in der abstrakten Klasse InputStream vordefiniert worden sind. Mit available kann die Anzahl an Bytes ausgelesen werden, die vom Datenstrom eingelesen werden kann, mit der Methode read() werden die Bytes eingelesen, mit skip können Bytes übersprungen werden. Mit der Methode mark kann eine bestimmte Quelle markiert werden, zu der wir mit der Methode reset hinspringen können. Und genauso ist es mit der Klasse OutputStream. Auch sie ist die Oberklasse zahlreicher Kindesklassen und auch dies schauen wir uns jetzt in der Typenhierarchie einmal an. Hierfür klicke ich mit der rechten Maustaste auf die Klasse OutputStream und wähle im Kontextmenü den Eintrag Open Type Hierarchie aus. Und auch hier sehen Sie jetzt, dass die abstrakte Klasse OutputStream zahlreiche Unterklassen für die jeweiligen Zwecke hat. Und hier auf der unteren Seite, sehen Sie die Methoden, die von den Unterklassen zu implementieren sind. Mit der Methode write werden die Bytes in den Ausgabe-Stream geschrieben und mit der Methode close wird der Datenstrom geschlossen. Die Methode flush wird dann eingesetzt, wenn die Unterklasse die Bytes zunächst in einem Puffer speichert und dieser mit der Methode flush in den Datenstrom gespült werden soll. In einem kleinen Programmierbeispiel werde ich Ihnen nun zeigen, wie man mit einem InputStream und einen Output Stream einsetzt, um hiermit eine Datei zu kopieren. InputStream ist eine abstrakte Klasse und kann deshalb nicht instanziiert werden. Und in der Typen Hierarchie haben Sie gesehen, dass für jeweilige Zwecke unterschiedliche Unterklassen existieren. Und um Ihnen nun einen Eingabe-Strom fuer das Einlesen aus einer Datei vorzuführen, werde ich die Unterklasse File InputStream verwenden. Vom Konstruktor der Klasse File Input Stream gibt es zwei Konstruktoren, das sehen wir gleich. new FileInputStream. Hier sehen Sie einen mit dem Datentypen File und einen mit dem Datentypen String. Ich zeige Ihnen zunächst einmal die Variante mit der Klasse file. Die Klasse file repräsentiert eine Datei oder ein Verzeichnis im Dateisystem. Für das Programmierbeispiel habe ich eine Datei vorbereitet, die ich Java.jpg genannt habe. Die Datei befindet sich im Objektverzeichnis, hier. Und auf diese Datei beziehe ich mich jetzt, wenn ich ein Objekt des Typs File erzeuge. Ich erzeuge also erstmal eine Variable des Typs file und dann initialisiere ich die Variable File mit der Klasse file Und um mich auf diese Datei jetzt zu beziehen, kann ich den Standard der Datei entweder als absoluten oder auch als relativen Pfad einsetzen und zwar hier in deiner Zeichenkette. Weil sich Linux und MacOS, also Unix-basierte von Windows-basierten Betriebssystemen hierbei unterscheiden und Java ja universell einsetzbar sein soll, muss man hierbei etwas beachten. Bei einem UNIX-basierten Betriebssystem ist der Datei-Trenner ein Schrägstrich und weil bei einem UNIX- basierten Betriebssystem bei Angabe eines absoluten Pfades automatisch vom Haupt-Dateisystem ausgegangen wird, könnte ich mich auf diese Datei hier, wie folgt beziehen. Und zwar könnte ich dort einen Schrägstrich hier in die Hochkommata reinschreiben und dann Users, das ist der Ort, wo sich bei mir der Workspace befindet und somit auch das Bild. users/trainer/workspace/ und dann Kapitel6_App1 Und dann /java.jpg. Nun ist es so, dass diese Angabe auch bei Windows funktionieren würde, weil Java das UNIX-Betriebssystem als das universell gültige Betriebssystem betrachtet, von dem aus alle anderen Betriebssystem entstamme. Und so ist es ja auch. Bei Windows gibt es aber auch noch eine andere Syntax und zwar die, die eben nur bei Windows gültig ist und bei der kann auch den Buchstaben des Dateisystems mit einem Doppelpunkt mit angeben. Und zwar dort. Außerdem könnte ich den Slash durch den bei Windows üblichen Backslash Trenner ersetzen. Natürlich müsste ich dann den Backslash mit einem weiteren Backslash jeweils escapen. Das Ganze sähe dann also so aus und auch hier. So, die Variante wäre nur bei Windows gültig. Dies würde bei einem Windows- Betriebssystem genauso funktionieren. Sieht aber aus der Sicht eines Java-Entwicklers fürchterlich aus und ist auch nicht portierbar. Besser ist es, wenn sie dann doch den Schrägstrich einsetzen, der dann universell gültig ist. Also so dann, über Strg + Z ändere ich das wieder ab und hab dann eine Variante, die wohl fast universell gültig ist. Ich sage fast, weil in Zukunft vielleicht neue Betriebssysteme hinzukommen, bei denen der Slash dann doch nicht funktioniert. Und wenn sie ganz sicher gehen wollen, dass ihr Programm in jedwedem, also auch in zukünftigen Betriebssystemen gültig sein wird, bei denen der Slash durch das was auch immer ersetzt ist, können Sie statt dem Querstrich auch die Konstante File.Separator einsetzen. Das wäre dann also so. Das zeige ich Ihnen auch noch. Dann würde man zunächst mal die Bezeichner von den Trennern erstmal trennen. So und jetzt könnte ich überall dort, wo ein Slash steht, File.separator reinschreiben. Den Ausdruck kopiere ich einmal über Strg + C und ersetze überall mal, wo Slash in Hochkommata steht, dann habe ich überall den File.separator und so würde das auch funktionieren und wäre dann womöglich in Zukunft auf in allen Betriebssystemen gültig. Nun komme ich zu der relativen Pfadangabe und zwar würde ich in unserem Beispiel auch so etwas schreiben können, und das werde in unserem Beispiel genauso funktionieren. Denn die relative Pfadeingabe, setzt Java hinter das sogenannte Arbeitsverzeichnis und verwendet dies insgesamt als absoluten Pfad, aber hierauf komme ich im nächsten Video zurück.

Java Grundkurs 3: Generische Programmierung, Datenströme, Datumsrechnung

Steigen Sie tiefer in die Java-Programierung ein und lernen Sie den Umgang mit generischen Typen, Lamda-Ausdrücken, DAtenströmen und mit Datums- und Zeitberechnung.

5 Std. 24 min (47 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:09.10.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!