Inhaltsverzeichnis

6.0 Klasse Stream (gb)

Ein Stream ist als Datenstrom aufzufassen, der zwischen Prozessen oder einem Prozess und einer Datenendverbindung fließt.

Übersicht zu den unterschiedlichen Arten von Datenendverbindungen, die in Linux global als Datei bezeichnet werden:

Hinweise:

Die Schnittstelle Stream gibt an, welche Methoden implementiert sind. Ein Stream verfügt u.a. über diese vier Methoden:

Öffnen (open), 
Daten lesen (read), 
Daten schreiben (write), 
Schließen(close). 

Die Klasse Stream ist die übergeordnete Klasse für jedes Gambas-Objekt, das einen Stream (Datenstrom) repräsentiert. Das bedeutet, das jede Klasse, die von der Klasse Stream (gb) als Basis-Klasse erbt, mindestens über diese vier Methoden verfügt. Diese (Basis-)Klasse können Sie nicht erzeugen. Welche Funktionalität eines Stream-Objekts Sie verwenden können, hängt von seiner genauen Klasse und auch von der Art der Objekterzeugung ab.

Für die praktische Arbeit ist es somit weitgehend unerheblich, ob Sie Daten zum Beispiel in eine reguläre Datei, in eine serielle Schnittstelle oder in eine Unix-Socket schreiben oder aus diesen Daten lesen. Hier finden Sie die Liste der Klassen, die von der Klasse Stream erben und im Gambas-Buch beschrieben werden:

Compress    	Kapitel 28.1.1
Uncompress  	Kapitel 28.1.2
Process     	Kapitel 21
SerialPort  	Kapitel 24.1.5
Curl        	Kapitel 24 (FTPClient und HTTPClient.)
File        	Kapitel 6.5
Named Pipe	Kapitel 6.2.1
Socket      	Kapitel 24 (TCP- und Local-Unix-Socket)
VideoDevice 	Kapitel 24

6.0.1 Eigenschaften

In Gambas ist ein Stream ein Objekt, das von der Stream-Klasse (gb) erbt und daher deren Eigenschaften und Methoden implementiert. Die Klasse Stream verfügt über diese Eigenschaften:

EigenschaftDatentypBeschreibung
Blocking BooleanGibt den Wahrheitswert True zurück oder setzt ihn, wenn der Stream blockiert wird. Wenn diese Eigenschaft auf True gesetzt ist, wird das Lesen aus dem Stream blockiert, wenn nichts zu lesen ist. Das Schreiben in den Stream wird blockiert, wenn beispielsweise der interne Systempuffer voll ist.
ByteOrder IntegerLiefert die Byte-Reihenfolge oder setzt die Byte-Reihenfolge, die zum Lesen oder Schreiben von Binärdaten in den Stream verwendet wird. Die Eigenschaft kann folgende Werte annehmen: gb.BigEndian als „Big endian byte order“ oder gb.LittleEndian als„Little endian byte order“.
EndOfFileBooleanDiese Eigenschaft signalisiert, ob die letzte Verwendung von LINE INPUT das Ende der Datei erreicht hat, anstatt eine ganze Zeile mit einem Zeilenendezeichen zu lesen.
EndOfLine IntegerGibt das vom aktuellen Stream verwendete Zeilenumbruch-Trennzeichen zurück oder setzt es. Die möglichen Werte sind: gb.Unix für durch Chr$(10) getrennte Zeilen, gb.Windows für durch Chr$(13) und Chr$(10) getrennte Zeilen, gb.Mac für durch Chr$(13) getrennte Zeilen. Der Wert dieser Eigenschaft wird von LINE INPUT, PRINT und der Eigenschaft Stream.Lines verwendet. Beachten Sie, dass Sie mit gb.Unix sowohl Unix- als auch Windows-Zeilenformate lesen können. Aber es schreibt nur das Unix-Format!
Handle IntegerGibt den mit dem aktuellen Stream verknüpften Systemdatei-Deskriptor zurück.
IsTermBooleanGibt True zurück, wenn ein Stream einem Terminal zugeordnet ist.
Lines .Stream.LinesGibt ein virtuelles Objekt (Typ String-Array) zurück, mit dem Sie einen Stream zeilenweise auslesen können.
TagVariantGibt den dem Stream zugeordneten Wert der Tag-Eigenschaft zurück oder setzt den Wert. Diese Eigenschaft vom Datentyp Variant ist für die freie Verwendung durch den Programmierer bestimmt und wird nicht von der Komponente verwendet.
Term.Stream.TermGibt ein virtuelles Objekt zurück, mit dem das dem Stream zugeordnete Terminal verwaltet werden kann. Die virtuelle Klasse Stream.Term (gb) hat die Eigenschaften Echo, FlowControl, Height, Width und Name sowie die Methode Resize. Link: http://gambaswiki.org/wiki/comp/gb/.stream.term

Tabelle 6.0.1.1 : Eigenschaften der Klasse Stream

6.0.2 Methoden

Die Klasse Stream besitzt diese sechs Methoden:

MethodeRückgabetypBeschreibung
Begin()-Startet das Puffern der in den Stream geschriebenen Daten, so dass beim Aufruf der Send-Methode alles auf einmal gesendet wird.
Close()-Schließt den Stream. Die Methode entspricht exakt der CLOSE-Anweisung.
Drop()-Löscht die Daten, die seit dem letzten Aufruf der Methode Begin() gepuffert wurden.
ReadLine([ Escape As String ]) StringLiest eine Textzeile aus dem Stream, genau so wie die Anweisung LINE INPUT. Wenn Escape angegeben ist, werden Zeilenumbrüche zwischen zwei Escape-Zeichen ignoriert. Diese Methode ist sehr nützlich beim Lesen von CSV-Dateien.
Send()-Sendet alle Daten auf einmal, die seit dem letzten Anruf der Methode Begin() gepuffert wurden.
Watch ( Mode As Integer, Watch As Boolean )-Startet oder stoppt die Beobachtung des Stream-Dateideskriptors zum Lesen oder Schreiben, nachdem er geöffnet wurde. Modus ist der Beobachtungstyp: gb.Read zur Beobachtung beim Lesen oder gb.Write zur Beobachtung beim Schreiben. Watch ist TRUE, um die Beobachtung zu aktivieren und FALSE, um sie zu deaktivieren.

Tabelle 6.0.2.1 : Methoden der Klasse Stream

6.0.3 Exkurs

6.0.3.1 Projekt

Das Projekt im Downloadbereich demonstriert, wie Sie mit Hilfe der Type-Eigenschaft eines Stat-Objektes die Art einer Datei ermitteln:

B1

Abbildung 6.0.3.1.1: Ermittlung der Art von Dateien

Die Zeichen -, d, l, b, c, p und s charakterisieren die Art einer Datei im Zusammenhang mit dem Befehl ls -l und der Anzeige der Ausgabe in einer Konsole.

6.0.3.2 Einsatz file-Befehl

Auch in einer Konsole können Sie mit dem file-Befehl schnell feststellen, um welche Art es sich bei einer vorgegebenen Datei handelt:

Reguläre Dateien (regular file)
-------------------------------
hans@mint-183 ~ $ file nwm.xml
nwm.xml: exported SGML document, ASCII text

Verzeichnisse (directory)
-------------------------
hans@mint-183 ~/BildTon $ file Fractals
Fractals: directory

Symbolische Links (symbolic link)
---------------------------------
hans@mint-183 ~/Schreibtisch $ file Formatting_DokuWiki_Tables
Formatting_DokuWiki_Tables: symbolic link to /home/hans/DW/0_DW_Convert/librewriter2dokuwiki.gambas

Blockorientierte Geräte (block device)
--------------------------------------
hans@mint-183 ~/Schreibtisch $ file /dev/sdd1
/dev/sdd1: block special (8/49)

Zeichenorientierte Geräte (char device)
---------------------------------------
hans@mint-183 ~ $ file /dev/ttyUSB0
/dev/ttyUSB0: character special (188/0)

Datenverbindungen zwischen Prozessen (named pipe)
-------------------------------------------------
hans@mint-183 ~ $ mknod mypipe p 	' Named Pipe erzeugen
hans@mint-183 ~ $ file mypipe
mypipe: fifo (named pipe)
hans@mint-183 ~ $ rm mypipe	' Named Pipe löschen

Kommunikationsendpunkt (unix socket)
------------------------------------
hans@mint-183 ~ $ file /run/user/1000/unix_socket.sock
/run/user/1000/unix_socket.sock: socket

6.0.3.3 Das #-Zeichen

In der Dokumentation steht zum Bespiel

FLUSH [ [ # ] Stream ]

wobei das #-Zeichen als optional gekennzeichnet ist. In Gambas können Sie das #-Zeichen dem Variablennamen eines Stream-Objektes voranstellen, aber nur für die Instruktionen CLOSE, READ, WRITE, SEEK, INPUT, LINE INPUT, PRINT, UNLOCK und FLUSH. Das geht nicht in Funktionsaufrufen wie LOF(…), EOF(…) oder der Instruktion LOCK.

In einem Socket_Read-Ereignis können Sie zum Beispiel folgende Zuweisung verwenden:

vData = Read #Last, -4096

In Last wird das Socket-Objekt zurückgegeben, das das Read-Event ausgelöst hat und von dem Daten gelesen werden können. Das „#Last“ sollten Sie dem „Last“ vorziehen, weil man „Last“ allein nicht ansieht, dass es sich in diesem Fall um einen Stream handelt.

Download