Трудно сказать, что не так, за пределами кода, который вы показали, но этот код, безусловно, а) хорошо и б) бессмысленно.
Enum.reduce/3
(как и все функции из Enum
модуль) действительно завершает поток. Тем не менее, строки
fullpath
|> File.stream!()
|> Stream.map(& &1)
|> Enum.reduce("", &2 <> &1)
по существу аналогичны File.read!/1
(может быть менее эффективно). Вы можете проверить, что они возвращают правильный ожидаемый результат, но они делают это немедленно .
with :ok <- File.write!("test.txt", "a\x00\n\x01b") do
"test.txt"
|> File.stream!()
|> Stream.map(& &1)
|> Enum.reduce("", & &2 <> &1)
end
#⇒ <<97, 0, 10, 1, 98>>
Тем не менее, вы можете лучше подписаться на делегирование работы существующим помощникам, таким как Plug.Conn.send_file/5
. Если вы все еще хотите переопределить эту функциональность, вы должны использовать встроенный тип iodata
, чтобы создать ваш объект, это быстрее, чем двоичные файлы (и Plug.Conn.send_resp/3
с радостью примет это).
Разделение и повторное объединение двоичных файлов не заставит его работать быстрее.