Подкласс NSInputStream для загрузки определенной части данных из локального пути к файлу

У меня есть 100 МБ данных в одном файле. Эти 100 мб данных будут разделены виртуально. т. е. мне нужно создать NSInputStream, который указывает на разные фрагменты размером 5 МБ. Это возможно путем создания потока с помощью NSData.

Но скорее я хотел бы знать, могу ли я иметь NSInputStream, который указывает на диапазон данных в файле?


person Sj.    schedule 03.05.2013    source источник
comment
Почему бы не использовать NSFileHandle вместо этого?   -  person maroux    schedule 03.05.2013
comment
в основном я не хочу создавать несколько экземпляров NSData размером 5 МБ. он съедает много памяти.   -  person Sj.    schedule 03.05.2013
comment
затем вы должны создать одну часть 5 МБ за раз в какой-то последовательной очереди, например   -  person art-divin    schedule 03.05.2013
comment
И вы не должны. Создайте NSFileHandle и прочитайте соответствующие байты по любому смещению, выполнив seekToFileOffset:.   -  person maroux    schedule 03.05.2013
comment
Здесь я буду загружать очень длинный файл из моего приложения для iOS. Я одновременно загружаю разные части одного и того же файла. Также может быть несколько загрузок файлов. Если я создам данные с дескриптором файла, эта загрузка займет около 30 МБ, чего я не хочу. Вот почему я подумал об использовании NSInputStream. Но с NSInputStream я не могу компенсировать буфер чтения. Или единственным решением будет запись каждых 5 МБ данных в файл и создание InputStream из этого файла ??   -  person Sj.    schedule 03.05.2013


Ответы (1)


Если вы хотите загрузить файл, передав экземпляр NSInputStream в NSURLRequest.HTTPBodyStream, вам действительно нужно создать подкласс NSInputStream и передавать только те байты, которые вы хотите загрузить. Использование NSFileHandle здесь не вариант.

Создать подкласс NSInputStream, который работает с NSURLRequest, довольно сложно, но, к счастью, вот отличный сообщение в блоге о том, как это можно сделать.

Здесь вы можете найти готовый подкласс NSInputStream для этой цели.

Вы можете скормить ChunkInputStream другому NSInputStream, читающему файл, и передать начальную позицию и количество байтов для чтения.

Быстрый пример:

let fileInputStream = NSInputStream(fileAtPath: "/tmp/readme")
let inputStream = ChunkInputStream(inputStream: fileInputStream)
inputStream.startPosition = 2097152
inputStream.readMax = 1048576
person seb    schedule 06.08.2015