Введение
Пакет FileIO предоставляет общий фреймворк для определения форматов файлов и диспетчеризации в соответствующие методы чтения и записи. Две основные функции в этом пакете называются load
и save
. Они обеспечивают высокоуровневую поддержку форматированных файлов (в отличие от низкоуровневых функций read
и write
в Julia). Во избежание конфликтов имен пакеты, обеспечивающие поддержку стандартных форматов файлов посредством функций с именами load
и save
, рекомендуется регистрировать в FileIO.
Использование
Если формат зарегистрирован, инструкций
using FileIO
obj = load(filename)
может быть достаточно для считывания данных из файла в этом формате. FileIO попытается найти установленный пакет, который поддерживает чтение filename
. Если такой пакет не найден, будет предложено добавить соответствующий пакет. Это может быть даже не файл; например, логотип Julia можно загрузить так:
julia> using FileIO, HTTP
julia> img = load(HTTP.URI("https://github.com/JuliaLang/julia-logo-graphics/raw/master/images/julia-logo-color.png"));
julia> typeof(img)
Matrix{RGBA{N0f8}} (alias for Array{ColorTypes.RGBA{FixedPointNumbers.Normed{UInt8, 8}}, 2})
Аналогичным образом, для сохранения может быть достаточно следующего вызова:
save(filename, obj)
Для сохранения значений в файлах можно также использовать стиль с вертикальной чертой:
obj |> save(filename)
Если вы хотите просто узнать формат файла, то следующий код:
file = query(filename)
s = query(io) # io — это поток
вернет объект File
или Stream
, в котором также закодирован распознанный формат файла.
Иногда требуется считывать или записывать файлы, которые не помещаются в доступную память либо длина которых неизвестна или не ограничена (например, считывать поток аудио- или видеоданных из сокета). В таких ситуациях обработать весь файл сразу не получится, и имеет смысл разделить его на части. На этот случай в FileIO есть функции loadstreaming
и savestreaming
, возвращающие объект, который можно считать (read
) или записать (write
), а не сами данные файла.
Выглядит это так:
using FileIO
audio = loadstreaming("bigfile.wav")
try
while !eof(audio)
chunk = read(audio, 4096) # считываем 4096 кадров
# обрабатываем фрагмент
end
finally
close(audio)
end
Либо используйте синтаксис do
для автоматического закрытия потока:
using FileIO
loadstreaming("bigfile.wav") do audio
while !eof(audio)
chunk = read(audio, 4096) # считываем 4096 кадров
# обрабатываем фрагмент
end
end
Обратите внимание, что для достижения максимальной эффективности в таких случаях может потребоваться использовать read!
с предварительно выделенным в памяти буфером.
Поддерживаемые форматы
Поддерживаемые в настоящее время форматы приведены в разделе Таблица реестра.
Поддержка новых форматов
Если вы хотите реализовать поддержку новых форматов в FileIO, это делается в два этапа:
-
Регистрация нового формата в FileIO
-
Реализация методов загрузки и сохранения в вашем пакете
Выполнять их можно в любом порядке.