ストリーム

ストリームは、HTTP、ファイルシステム、その他のモジュールに対する増分 I/O を提供します。基になるデータを所有するモジュールがストリームオブジェクトを作成します。このページは API リファレンスです。スキャナーループの process(token) はアプリケーション側で定義するコールバックです。

ストリームの取得

-- 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

読み取り

local chunk, err = stream:read(size)
パラメータ 型 説明
size integer 読み取るバイト数(0 = デフォルトの 32KB チャンク)

戻り値: string, error — EOF では nil, nil

書き込み

local bytes, err = stream:write(data)
パラメータ 型 説明
data string 書き込むデータ

戻り値: integer, error — 書き込まれたバイト数

シーク

local pos, err = stream:seek(whence, offset)
パラメータ 型 説明
whence string "set"、"cur"、または"end"
offset integer バイト単位のオフセット

戻り値: integer, error — 新しい位置

フラッシュ

local ok, err = stream:flush()

flush はバッファリングされたデータを基になる出力先へ書き込みます。

ストリーム情報

local info, err = stream:stat()
フィールド 型 説明
size integer 合計サイズ(不明の場合-1)
position integer 現在の位置
readable boolean 読み取り可能
writable boolean 書き込み可能
seekable boolean シーク可能

クローズ

local ok, err = stream:close()

close はストリームのリソースを解放します。複数回呼び出せます。

スキャナ

ストリームの内容をトークン化するスキャナーを作成します。

local scanner, err = stream:scanner(split)
パラメータ 型 説明
split string "lines"、"words"、"bytes"、"runes"

スキャナメソッド

local has_more, err = scanner:scan()  -- 次のトークンに進む
local token = scanner:text()           -- 現在のトークン
local err_msg = scanner:err()          -- スキャナのエラー(あれば)
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

scan() が false を返した場合は、EOF と判断する前に scanner:err() を確認してください。トークン化や基になる読み取りの失敗はスキャナーに保存され、scan() の第 2 戻り値には現れません。

エラー

条件 種別
無効なwhence/splitタイプ Luaエラーとして送出される(返されない)
ストリームがクローズ済み INTERNAL
読み取り/書き込み不可 INTERNAL
読み取り/書き込み失敗 INTERNAL

未対応の whence またはスキャナー分割値を指定すると、構造化エラー値ではなく Lua の引数エラーが発生します。