![]() |
|
||||||||||
|
|||||
|
Добрый день,
Реализую AIR приложение, которое представляет из себя uploader больших файлов. На рассмотрение: К примеру, вот такой вот код моей реализации, который из определенного файла загружает в byteArray его последние READING_DATA_SIZE байт; package { import flash.utils.ByteArray; import flash.events.Event; import flash.filesystem.File; import flash.filesystem.FileMode; import flash.filesystem.FileStream; public class Core { private static const READING_DATA_SIZE:uint = 500; private var _fileHandler:File; private var _fileStream:FileStream; public function Core() { _fileHandler = new File("bigfile.bin"); trace("File Size:", _fileHandler.size); _fileStream = new FileStream(); _fileStream.addEventListener(Event.COMPLETE, this.evFileLoadingCompleteHandler); _fileStream.openAsync(_fileHandler, FileMode.READ); // устанавливаем позицию, с которой будет производиться начало чтения данных файла; _fileStream.position = _fileHandler.size - Core.READING_DATA_SIZE; } public function evFileLoadingCompleteHandler(e:Event):void { var readingData:ByteArray = new ByteArray(); var instance:FileStream = e.currentTarget as FileStream; instance.readBytes(readingData, 0, Core.READING_DATA_SIZE); instance.close(); trace("Reading Data Size:", readingData.bytesAvailable); } } } |
|
|||||
|
Дело в том, что я использую метод
вместо Это для того, что бы гарантированно знать что чтение было окончено (сработает подписка на событие _fileStream.addEventListener(Event.COMPLETE, this.evFileLoadingCompleteHandler)) И, в данном случае, если начинаются проблемы! Увидеть в чем проблема мы сможем, если в конструктор добавим setInterval(getBuffLength, 1); то увидим что чтение файла начинается вовсе не с позиции _fileStream.position, а с самого начала файла. То есть - мы уверенно скармливаем оперативной памяти 4 гигабайта данных!!!! А при чтении данных через _fileStream.open() мы не имеем возможности получать какие то события о том, что чтение данных успешно завершено (Event.COMPLETE)!!! Вот они подводные камни!!!! |
|
|||||
|
Регистрация: Jun 2012
Сообщений: 17
|
Я понимаю, что ответ на этот вопрос автору топика уже давно не актуален. Но он был актуален для меня еще пару часов назад. Теперь ответ найден, может он кому-то пригодиться еще.
Цитата:
Цитата:
Цитата:
Цитата:
Все они легко обходятся! Вот Ваш итоговый код, каким он должен быть: package { import flash.utils.ByteArray; import flash.events.Event; import flash.filesystem.File; import flash.filesystem.FileMode; import flash.filesystem.FileStream; public class Core { private static const READING_DATA_SIZE:uint = 500; private var _fileHandler:File = null; private var _fileStream:FileStream = null; private var _readingData:ByteArray = null; public function Core() { _readingData = new ByteArray(); _fileHandler = new File("bigfile.bin"); _fileStream = new FileStream(); _fileStream.open(_fileHandler, FileMode.READ); // Устанавливаем позицию, с которой будет производиться начало чтения данных файла _fileStream.position = _fileHandler.size - READING_DATA_SIZE; // Чтение данных в буфер, если количество доступных данных не очень много, // то считывание происходит быстро _fileStream.readBytes(_readingData, 0, _fileStream.bytesAvailable); _fileStream.close(); trace("Reading Data Size: " + _readingData.bytesAvailable); // = READING_DATA_SIZE } } } |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:47. |
|
|
« Предыдущая тема | Следующая тема » |
|
|