コンテンツにスキップ

ストリーム

データを効率的に処理するためのストリーム読み書き操作。ストリームオブジェクトは他のモジュール(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)
パラメータ説明
sizeinteger読み取るバイト数(0 = 利用可能なすべてを読み取り)

戻り値: string, error — EOFでnil

-- 残りのすべてのデータを読み取り
local data, err = stream:read_all()
local bytes, err = stream:write(data)
パラメータ説明
datastring書き込むデータ

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

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

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

local ok, err = stream:flush()

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

local info, err = stream:stat()
フィールド説明
sizeinteger合計サイズ(不明の場合-1)
positioninteger現在の位置
readableboolean読み取り可能
writableboolean書き込み可能
seekablebooleanシーク可能
local ok, err = stream:close()

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

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

local scanner, err = stream:scanner(split)
パラメータ説明
splitstring"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