Потоки

Операции чтения/записи потоков для эффективной обработки данных. Объекты 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)
Параметр Тип Описание
size integer Байт для чтения (0 = чанк по умолчанию 32KB)

Возвращает: string, error — nil, nil при EOF

Запись

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

Закрыть поток и освободить ресурсы. Безопасно вызывать несколько раз.

Scanner

Создать токенизатор для содержимого потока:

local scanner, err = stream:scanner(split)
Параметр Тип Описание
split string "lines", "words", "bytes", "runes"

Методы Scanner

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

Ошибки

Условие Kind
Неверный тип whence/split возбуждается как ошибка Lua (не возвращается)
Поток закрыт INTERNAL
Не читаемый/записываемый INTERNAL
Ошибка чтения/записи INTERNAL