We're sorry but this page doesn't work properly without JavaScript enabled. Please enable it to continue.
Feedback

07.2.1 Datenströme, Streams, Teil 1

00:00

Formal Metadata

Title
07.2.1 Datenströme, Streams, Teil 1
Title of Series
Number of Parts
54
Author
License
CC Attribution - NonCommercial - ShareAlike 3.0 Germany:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal and non-commercial purpose as long as the work is attributed to the author in the manner specified by the author or licensor and the work or content is shared also in adapted form only under the conditions of this
Identifiers
Publisher
Release Date
Language
Producer

Content Metadata

Subject Area
Genre
Mass storageComputer fileWordData streamFunction (mathematics)Word processorInternetStandardfunktionCursor (computers)Sequential accessComputer animation
Computer fileCursor (computers)Social classData streamFunktionalitätTypProgrammer (hardware)BuildingFunction (mathematics)Hard disk driveData structureQueue (abstract data type)Tape driveDirection (geometry)Computer animationDiagram
Computer fileTape driveFRAMEWORK <Programm>KlassenbibliothekSocial classEntire functionCalculationTypInternetFunction (mathematics)Data streamEncryptionCursor (computers)FunktionalitätComputer animation
Function (mathematics)7 (number)Computer animationDiagram
Reading (process)Tape driveComputer animation
Cursor (computers)Function (mathematics)Reading (process)Computer animation
Tape driveComputer animation
Computer fileComputer animation
Cursor (computers)Computer animation
Cursor (computers)PositionComputer animation
Computer filePositionCommon-LISP object systemSocial classComputer animation
Constructor (object-oriented programming)Tape driveComputer animation
Computer fileConstructor (object-oriented programming)Computer animation
Transcript: German(auto-generated)
Wann kommt man nicht mit den eingebauten Funktionen für Dateien und Verzeichnissen zu Rande? Wann braucht man Datenströme, Streams in folgenden Situationen? Wenn Sie Dateien in Gigabyte Größe haben, die wollen Sie nicht auf einen Schlag in den Speicher laden,
dann ist die Maschine erst mal am Rappeln und ab 2 Gigabyte wird es dann auch ein bisschen brenzlig, was den Speicher anbelangt auf den modernen Maschinen. Wenn Sie nicht gerade eine 64-Bit-Maschine haben mit 8 Gigabyte,
also sobald Sie richtig große Dateien haben, werden Sie das nicht auf diese Art machen. Das empfiehlt sich nicht. Eine andere Stelle, an der man es nicht mit den Standardfunktionen von eben machen kann, ist, wenn ein Datei aus dem Internet kommt, anderswoher, ich schreibe mal aus dem Netz,
ein Datei kommt aus dem Netz, nicht dem Stromnetz, dem Datennetz, und das Ende fehlt noch. Das kennen Sie, wenn Sie was downloaden, das nächste dicke Update, x 100 Megabyte, die erste Hälfte ist schon da, aber die zweite Hälfte steckt noch irgendwo in der Leitung.
Wenn Sie so eine Datei aufmachen mit den eingebauten Funktionen, gibt es natürlich etwas auf die Finger, wenn der noch nicht da ist, noch nicht komplett da ist. Da brauche ich eine Funktion, die tatsächlich in der Lage ist, am Anfang anzufangen zu lesen,
soweit, wie es denn bisher geht, und nicht sofort versucht, die ganze Datei einzulesen. Also es kann sein, dass die Datei noch nicht komplett da ist, weil sie von außen kommt. Es kann aber auch sein, dass die Datei nicht komplett da ist, weil sie aus Messwerten erzeugt wird.
Datei aus Messwerten erzeugt, stellen Sie sich vor, Sie messen ein Jahr lang irgendwelche metrologischen Daten, speichern das immer wieder in eine Datei, machen die aber niemals zu.
Und da aus Messwerten erzeugt, noch nicht alles gemessen, das Jahr ist noch nicht um. Dann ist die Datei auch noch nicht geschlossen. Sie kriegen die nicht mit diesem Standard-Filepunkt irgendwas Funktionen auf. Erzeugt noch nicht alles gemessen.
In solchen Situationen muss man anders rangehen können. Da brauche ich Datenströme. Ich mal noch einmal die Zeichnung auf, die ich eben schon mal hatte, über diesen sequenziellen Zugriff.
Was man sich vorstellt bei solchen Datenströmen ist, ich habe eine Folge an Bits, eigentlich sogar eine Folge an Bits, aber so hart macht man es dann doch wieder nicht. Eine Folge an Bits, die dann typischerweise auch einen Start hat und typischerweise auch ein Ende hat.
Und auf dieser Folge sitzt ein Cursor. Wie der Cursor in der Textverarbeitung. Der hier heißt ja auch Cursor.
Strich, der Läufer in der Textverarbeitung. Da drin sitzt ein Cursor. Das ist die Stelle an der geschrieben und gelesen wird. Wenn Sie ein Byte lesen, das Byte was hier steht, bringen Sie das eine Byte zurück und der Cursor geht eins weiter. Wenn Sie dann noch ein Byte lesen, bringen Sie den hier zurück und der Cursor geht eins weiter.
Wenn Sie ein Byte schreiben, steht das da drin und der Cursor geht eins weiter. Also schreiben und lesen an der Stelle des Cursors. Je nach Typ dieses Datenstroms kann man den Cursor selber setzen oder auch nicht.
Bei Dateien auf der Festplatte kann man netterweise dann sagen, geh doch mal an den Start zurück oder geh mal 100.000 Richtung Ende. Wenn das hier so eine Pseudodatei ist, die einfach zum Beispiel aus Tastatureingaben besteht,
dann können Sie schlecht sagen, geh mal eine Million nach vorne, weil da gibt es ja noch gar nichts an der Stelle an Eingaben. Das ist also eine wesentliche Wiederscheidung. Dann kann dieser Cursor bewegt werden von Hand oder läuft er einfach eins weiter, wenn ich was lese und wenn ich was schreibe.
Das ist das absakte Modell hinter dem Stream. Man nimmt sich diese Vorstellung von Dateien und abstrahiert das zu einem Stream. Analog hatten wir die Vorstellung von einer Warteschlange bei der Post, jetzt zu einer Queue, eine Datenstruktur, in die ich hinten was dran stellen kann und vorne was abholen kann.
Analog hat man jetzt hier bei dem Stream eine Abstraktion von dem Begriff der Datei. Eine Sequenz, eine Folge von Bytes mit einem Cursor, der automatisch weiter läuft, wenn ich lese, wenn ich schreibe,
und der vielleicht auch platzierbar ist, aber nicht unbedingt. All das ist zusammengepackt in Stream, das können wir uns im Objektkatalog angucken. Wichtig ist hier durchsuchen.net Framework 4, dass er auch wirklich alles zeigt, was er hat. Ich gucke mir den Stream an und jetzt habe ich tatsächlich hier auch abgeleitete Typen stehen.
Der Stream selbst ist eine abstrakte Klasse. Ich hatte ihn schon angedroht, dass das Framework davon reichlich Gebrauch macht. Diese Klassenbibliothek macht reichlich Gebrauch davon. Der Stream selbst ist eine abstrakte Klasse, ist nicht nur eine Abstraktion
im umgangssprachlichen Sinne, sondern ist wirklich auch abstrakt. Es gibt den Stream als solchen nirgendwo wirklich. Es gibt keine Möglichkeit, ein Ding von diesem Typ, exakt diesem Typ zu erzeugen. Sie können keinen Stream aufrufen, eine abstrakte Klasse. Aber es gibt monströs viele abgeleitete Klassen,
die dieselbe Funktionalität bieten wie der Stream, die dann aber mit Leben füllen. Da finden Sie zum Beispiel hier Verschlüsselung. Verschlüsselung kann ich so verkaufen. Ein Cursor wandert durch die Daten durch. Ich darf das nächste Byte lesen. Ich darf vielleicht auch ein Byte schreiben.
File Stream, das sind nachher die üblichen Dateiströme. Datenströme aus Dateien. Die normalen Dateien werden hier dann zu File Streams. Sie können zippen, ein Byte hinzu, ein Byte lesen, wenn Sie wollen.
Schritt für Schritt, als ob das ein Stream wäre. Was haben wir noch? Spannendes. Sie können ein Stream einfach in den Speicher reinschreiben, um Speicher auf dieselbe Weise zu verwenden. Und Sie können ein Stream übers Netzwerk schicken. Zum Beispiel per Internet von einem zum nächsten Rechner schicken.
Die Funktionen, mit denen darauf zugegriffen werden, sind dieselben. Das ist das Nette. Alles ist Stream. Es sieht von außen so aus, wie ein Stream aussieht. Mit einem Cursor, der automatisch weiterläuft. Und ich kann lesen und schreiben, Byteweise. Wenn denn das jeweilige Ding lesbar oder lesen und schreiben erlaubt.
Das ist das Nette. Sobald man in Stream einmal verstanden hat, kann man hier diese ganzen Funktionen genauso verwenden, weil die abstrahiert werden auf dieselbe Weise. Jetzt drehen wir nochmal an, was der Stream als solcher bietet. Was der Stream als solcher bietet, erben ja diese ganzen hier die wesentlichen Funktionen.
Was hat ein Stream? Für die Sieben. Für die Sieben. Die wesentlichen Funktionen eines Streams. Einmal hier noch zum Schluss durch den Objektkatalog geblättert.
Was kann der Stream? Das Wichtigste könnte sein, Sie können den Stream fragen, ob denn er zum Lesen geeignet ist. Kann ich daraus lesen? Can read. Das muss nicht unbedingt sein. Es gibt Streams, in die Sie nur schreiben können.
Can read. Kann ich lesen aus dem Stream? Wenn Sie lesen können aus dem Stream, dann wäre das hier hilfreich. Read, byte und read. Mit der Funktion holen Sie das nächste byte. Der Cursor geht eins weiter. Mit der Funktion holen Sie die nächsten 1000 bytes, wenn Sie wollen, und der Cursor geht 1000 bytes.
Also read, byte und read gehören dann dazu zwangsläufig. Read, byte und read. Das Gegenstück dazu ist schreiben. Kann ich auf den Stream schreiben? Das ist hier mit can write.
Auf eine normale CD, keine CD-R, können Sie nicht schreiben. Also can write wird definitiv da falsch sein. Sie können nicht drauf schreiben. Oder wenn Sie kein Recht haben darauf zu schreiben, weil die Datei in einem verbotenen Bereich liegt,
dann ist dann hoffentlich auch can write gleich falsch. Das ist das Gegenstück dazu. Can write. Analog gibt es dann write, byte. Ein byte schreiben und der Cursor rutscht weiter. Und write 1000 bytes. Oder wie viel auch immer Sie wollen. Das Lesen von write, byte.
1000 bytes oder wie viel auch immer zu schreiben bei write. Wie viel Sie angeben. Dann hatte ich noch gesagt, wesentlich ist auch, ob ich den Cursor versetzen kann. Das ist can seek. Seek heißt diese Operation, bei der man den Cursor durch die Gegend schiebt.
Etwas suchen. Also wenn Sie hier den Cursor in die Hand nehmen und schieben den da irgendwo hin. Das wäre to seek. Wenn das erlaubt ist, teilt uns das can seek mit. Ja oder nein. Dann gibt es einfach eine Property,
die heißt Position. Da sehen Sie Position. Mit der können Sie es dann einfach setzen. Auf das so und so vielte byte. Und das allerletzte Wichtige ist close. Close. Den Stream schließen. Wie man eine Datei schließt, das andere Leute auch mal dürfen.
In jedem Fall, wenn man fertig ist, mit dem Stream sollte man close aufrufen. Wenn Sie sich wundern, wo open ist, wenn er geschlossen wird, muss er irgendwo geöffnet werden zu Beginn. Das Öffnen findet dann im Konstruktor statt. Der Streamer als solcher, die abstrakte Klasse,
hat da keinen Konstruktor, sonst wäre er ja nicht abstrakt. Er bietet erst mal nur close. Die Kindklassen, zum Beispiel Filestream, die Kindklassen bieten einem dann den entsprechenden Konstruktor. Welchen zum Beispiel?
Den zum Beispiel. Wo Sie sagen, diese Datei bitte öffnen. Und wenn man fertig ist, am Ende ruft man dann close auf. Da mache ich nächstes Mal weiter.