Streams

Streams bieten inkrementelles I/O für HTTP-, Dateisystem- und andere Module. Die Module, denen die zugrunde liegenden Daten gehören, erstellen die Stream-Objekte. Diese Seite ist eine API-Referenz; die Scanner-Schleife verwendet einen anwendungsdefinierten Callback process(token).

Einen Stream beziehen

-- From HTTP request body
local stream, err = req:stream()
if err then return nil, err end

-- From filesystem
local fs = require("fs")
local volume, err = fs.get("app:data")
if err then return nil, err end

local stream, err = volume:open("/file.txt", "r")
if err then return nil, err end

Lesen

local chunk, err = stream:read(size)
Parameter Typ Beschreibung
size integer Zu lesende Bytes (0 = Standard-Chunk von 32 KB)

Gibt zurück: string, error — nil, nil bei EOF

Schreiben

local bytes, err = stream:write(data)
Parameter Typ Beschreibung
data string Zu schreibende Daten

Gibt zurück: integer, error — geschriebene Bytes

Positionieren

local pos, err = stream:seek(whence, offset)
Parameter Typ Beschreibung
whence string "set", "cur" oder "end"
offset integer Offset in Bytes

Gibt zurück: integer, error — neue Position

Flushen

local ok, err = stream:flush()

flush schreibt gepufferte Daten in das zugrunde liegende Ziel.

Stream-Info

local info, err = stream:stat()
Feld Typ Beschreibung
size integer Gesamtgröße (-1 wenn unbekannt)
position integer Aktuelle Position
readable boolean Kann gelesen werden
writable boolean Kann geschrieben werden
seekable boolean Kann positioniert werden

Schließen

local ok, err = stream:close()

close gibt die Ressourcen des Streams frei und kann mehrfach aufgerufen werden.

Scanner

Tokenizer für Stream-Inhalt erstellen:

local scanner, err = stream:scanner(split)
Parameter Typ Beschreibung
split string "lines", "words", "bytes", "runes"

Scanner-Methoden

local has_more, err = scanner:scan()  -- Zum nächsten Token vorrücken
local token = scanner:text()           -- Aktuelles Token
local err_msg = scanner:err()          -- Scanner-Fehler falls vorhanden
while true do
    local has_token, err = scanner:scan()
    if err then return nil, err end
    if not has_token then break end  -- EOF
    process(scanner:text())
end

Wenn scan() den Wert false zurückgibt, prüfen Sie scanner:err(), bevor Sie das Ergebnis als EOF behandeln. Tokenisierungsfehler und Fehler beim zugrunde liegenden Lesen werden im Scanner gespeichert und erscheinen nicht im zweiten Rückgabewert von scan().

Fehler

Bedingung Art
Ungültiger whence/split-Typ wird als Lua-Fehler ausgelöst (nicht zurückgegeben)
Stream geschlossen INTERNAL
Nicht lesbar/schreibbar INTERNAL
Lese-/Schreibfehler INTERNAL