ストリーム

データを効率的に処理するためのストリーム読み書き操作。ストリームオブジェクトは他のモジュール(HTTP、ファイルシステムなど)から取得されます。

ロード

-- HTTPリクエストボディから
local stream = req:stream()

-- ファイルシステムから
local fs = require("fs")
local stream = fs.get("app:data"):open("/file.txt", "r")

読み取り

local chunk, err = stream:read(size)
パラメータ 説明
size integer 読み取るバイト数(0 = 利用可能なすべてを読み取り)

戻り値: string, error — EOFでnil

-- 残りのすべてのデータを読み取り
local data, err = stream:read_all()

書き込み

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

バッファリングされたデータを基礎となるストレージにフラッシュ。

ストリーム情報

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

クローズ

local ok, err = stream:close()

ストリームをクローズしてリソースを解放。複数回呼び出しても安全。

スキャナ

ストリームコンテンツ用のトークナイザを作成:

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

スキャナメソッド

local has_more = scanner:scan()  -- 次のトークンに進む
local token = scanner:text()      -- 現在のトークンを取得
local err_msg = scanner:err()     -- エラーがあれば取得
while scanner:scan() do
    local line = scanner:text()
    process(line)
end
if scanner:err() then
    return nil, errors.new("INTERNAL", scanner:err())
end

エラー

条件 種別
無効なwhence/splitタイプ INVALID
ストリームがクローズ済み INTERNAL
読み取り/書き込み不可 INTERNAL
読み取り/書き込み失敗 INTERNAL