Потоки
Операции чтения/записи потоков для эффективной обработки данных. Объекты 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
Заголовок раздела «Scanner»Создать токенизатор для содержимого потока:
local scanner, err = stream:scanner(split)| Параметр | Тип | Описание |
|---|---|---|
split | string | "lines", "words", "bytes", "runes" |
Методы Scanner
Заголовок раздела «Методы 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)endif scanner:err() then return nil, errors.new("INTERNAL", scanner:err())end| Условие | Kind |
|---|---|
| Неверный тип whence/split | INVALID |
| Поток закрыт | INTERNAL |
| Не читаемый/записываемый | INTERNAL |
| Ошибка чтения/записи | INTERNAL |