Как получить байтовый массив из файлового потока в Adobe AIR?

Читаю ограниченно (маленькие - 15 - 500 мб файлы). Мне нужно иметь возможность поместить все байты файла в один массив байтов. Итак, у меня есть функция:

        [Bindable]
        public var ba:ByteArray = new ByteArray;
        //.... code ....//
        protected function fileOpenSelected(event:Event):void
        {
            currentFile = event.target as File;
            stream = new FileStream();
            stream.openAsync(currentFile, FileMode.READ);
            stream.readBytes(ba);
            stream.close();

                            MyFunction(ba);
        }

Но это не работает =( - выдает ошибку: Ошибка № 2030: Обнаружен конец файла.

Как получить полный байтовый массив из потока, чтобы использовать его как обычный байтовый массив?


person Rella    schedule 27.05.2010    source источник


Ответы (2)


Разве смысл FileStream не в том, что у вас нет обычного ByteArray, а вы читаете асинхронно? Он реализует IDataInput, что позволяет читать из него, пока bytesAvailable больше 0.

в каждом событии прогресса вы можете просто readBytes вывести ByteArray, и как только вы получите полное событие, вы сможете его использовать.

приветствие
back2dos

person back2dos    schedule 27.05.2010
comment
но я хочу, чтобы мой bytaarray (- мой класс использует его!) - person Rella; 27.05.2010
comment
ну, либо вы используете подход, который я описал, либо вы пытаетесь File::load(), а затем получаете доступ к File::data - person back2dos; 27.05.2010
comment
Проголосовали против, потому что либо вы описываете старый метод ожидания event.complete и передачи данных обработчику событий, либо это было сформулировано довольно запутанно. Получить ByteArray из FileStream должно быть проще простого (и некоторым из нас это действительно нужно). - person CodeMouse92; 10.11.2012

Я, наконец, понял это, просматривая документацию некоторое время. Вау!

В моем случае мне приходилось читать wav-файл как bytesArray для класса, который я использовал, поэтому я мог использовать его по запросу в общедоступной области.

var file:File = File.applicationDirectory.resolvePath("blip.wav");
var fileStream:FileStream = new FileStream(); 
fileStream.open(file, FileMode.READ);
var bytes:ByteArray = new ByteArray
fileStream.readBytes(bytes);
fileStream.close();

Надеюсь, это поможет вам так же, как помогло мне. Я протестировал его и подтвердил, что он работает.

person CodeMouse92    schedule 10.11.2012
comment
разве не должно быть new ByteArray() - person dOM; 21.04.2015
comment
Я не использовал AS3 с ноября 2014 года, но знаю, что все работает так, как и ожидалось. Кроме того, я знаю, что вы опускаете круглые скобки при вызове пустого конструктора в C++, хотя я не могу вспомнить, перенесено ли это правило в AS3. - person CodeMouse92; 21.04.2015