AS3 Работа с произвольно большими файлами - PullRequest
3 голосов
/ 24 февраля 2010

Я пытаюсь прочитать очень большой файл в AS3, и у меня возникают проблемы со средой выполнения, которая просто вылетает на меня. В настоящее время я использую FileStream для асинхронного открытия файла. Это не работает (происходит сбой без исключения) для файлов размером более 300 МБ.

_fileStream = new FileStream();
_fileStream.addEventListener(IOErrorEvent.IO_ERROR, loadError);
_fileStream.addEventListener(Event.COMPLETE, loadComplete);
_fileStream.openAsync(myFile, FileMode.READ);

При просмотре документации кажется, что класс FileStream все еще пытается прочитать весь файл в память (что плохо для больших файлов).

Существует ли более подходящий класс для чтения больших файлов? Я действительно хотел бы что-то вроде буферизованного класса FileStream, который загружает только байты из файлов, которые будут прочитаны следующим.

Я ожидаю, что мне, возможно, потребуется написать класс, который сделает это для меня, но тогда мне нужно будет читать только часть файла за раз. Я предполагаю, что я могу сделать это, устанавливая свойства position и readAhead FileStream для чтения фрагмента из файла за раз. Я хотел бы сэкономить время, если такой класс уже существует.

Есть ли хороший способ обработки больших файлов в AS3 без загрузки всего содержимого в память?

Ответы [ 2 ]

3 голосов
/ 06 июля 2010

Вы можете использовать свойства fileStream.readAhead и fileStream.position, чтобы указать, сколько файловых данных вы хотите прочитать и где в файле вы хотите, чтобы они были прочитаны.

Допустим, вы хотите прочитать только мегабайт 152 гигабайтного файла. Сделай это; (Гигабайтный файл состоит из 1073741824 байт) (Мегабайт 152 начинается с 158334976 байт)

var _fileStream = new FileStream();
_fileStream.addEventListener(Event.COMPLETE, loadComplete);
_fileStream.addEventListener(ProgressEvent.PROGRESS, onBytesRead);
_fileStream.readAead = (1024 * 1024); // Read only 1 megabyte  
_fileStream.openAsync(myFile, FileMode.READ);
_fileStream.position = 158334976; // Read at this position in file  

var megabyte152:ByteArray = new ByteArray();

function onBytesRead(e:ProgressEvent)
{
    e.currentTarget.readBytes(megabyte152);
    if (megabyte152.length == (1024 * 1024))
    {
        chunkReady();
    }
}

function chunkReady()
{
    // 1 megabyte has been read successfully \\  
    // No more data from the hard drive file will be read unless _fileStream.position changes \\  
}
2 голосов
/ 24 февраля 2010

Не можете ли вы создать поток и прочитать фрагмент байтов с заданным смещением, фрагмент за раз ... так:

function readPortionOfFile(starting:int, size:int):ByteArray
{
    var bytes:ByteArray ...
    var fileStream:FileStream ...    

    fileStream.open(myFile);
    fileStream.readBytes(bytes, starting, size);
    fileStream.close();

    return bytes;
}

, а затем повторите при необходимости.Я не знаю, как это работает, и не проверял, но у меня сложилось впечатление, что это работает.

...