Потоки
Операции чтения/записи потоков для эффективной обработки данных. Объекты 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 = читать всё доступное) |
Возвращает: string, error — nil при EOF
-- Прочитать все оставшиеся данные
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()
Закрыть поток и освободить ресурсы. Безопасно вызывать несколько раз.
Scanner
Создать токенизатор для содержимого потока:
local scanner, err = stream:scanner(split)
| Параметр | Тип | Описание |
|---|---|---|
split |
string | "lines", "words", "bytes", "runes" |
Методы Scanner
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/split | INVALID |
| Поток закрыт | INTERNAL |
| Не читаемый/записываемый | INTERNAL |
| Ошибка чтения/записи | INTERNAL |