Перейти к содержимому

Потоки

Операции чтения/записи потоков для эффективной обработки данных. Объекты Stream получаются из других модулей (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 — nil при EOF

-- Прочитать все оставшиеся данные
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
УсловиеKind
Неверный тип whence/splitINVALID
Поток закрытINTERNAL
Не читаемый/записываемыйINTERNAL
Ошибка чтения/записиINTERNAL