Документация Engee

Введение

Пакет 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, это делается в два этапа:

Выполнять их можно в любом порядке.