FileReference.save() дублирует ByteArray

Я столкнулся с проблемой памяти при использовании FileReference.save(). Мое приложение Flash генерирует много данных в режиме реального времени и должно сохранить эти данные в локальном файле. Как я понимаю, Flash 10 (в отличие от AIR) не поддерживает потоковую передачу в файл. Но что еще хуже, FileReference.save () дублирует все данные перед их сохранением. Я искал обходной путь к этому удвоенному использованию памяти и думал о следующем подходе:

Что если я передам пользовательский подкласс ByteArray в качестве аргумента FileReference.save(), где этот подкласс ByteArray переопределит все методы read*(). Переопределенные методы read*() будут ожидать, пока мое приложение сгенерирует фрагмент данных, вернут этот фрагмент данных и немедленно удалят его из памяти. Я знаю, сколько данных будет сгенерировано, поэтому я мог бы также переопределить методы length / bytesAvailable.

Было бы возможно? Не могли бы вы дать мне подсказку, как это сделать? Я создал подкласс ByteArray, зарегистрировал для него псевдоним, передал экземпляр этого подкласса в FileReference.save(), но каким-то образом FileReference.save(), кажется, обрабатывает его так же, как это был экземпляр ByteArray, и не вызвать любой из моих переопределенных методов...

Большое спасибо за любую помощь!

2 ответа

Это не то, что я пробовал раньше, но вы можете попробовать отправить данные в приложение php, которое будет обрабатывать сохранение ByteArray на сервер, так же, как сохранение изображения на сервере, так что вместо этого вы будете использовать URLLoader.data используя что-то вроде этого:

http://www.zedia.net/2008/sending-bytearray-and-variables-to-server-side-script-at-the-same-time/

Это интересная идея. Возможно, для начала вам нужно просто добавить трассировки в расширенный массив ByteArray, чтобы увидеть, как FileReference#save() работает внутри.

Если у него есть какой-то

while( originalByteArray.bytesAvailable ) 
  writeToSaveBuffer( originalByteArray.readByte() );

функциональность переопределений может просто обрезать исходный буфер при каждом чтении, как вы говорите, что-то вроде:

override function readByte() : uint {
  var b : uint = super.readByte();
  // Truncate the bytes (assuming bytesAvailable = length - removedBytes)
  length = length - bytesAvailable;
  return b;
}

С другой стороны, если это теперь работает, я предполагаю, что исходный байтовый массив больше не будет доступен в приложении.

(я сам не проверял, усечение может потребовать больше работы, чем в примере)

Другие вопросы по тегам