AS3使用任意大文件

时间:2010-02-23 21:40:37

标签: flex actionscript-3 air large-files

我正在尝试在AS3中读取一个非常大的文件,并且运行时遇到了问题。我目前正在使用FileStream异步打开文件。对于大于约300MB的文件,这不起作用(没有异常崩溃)。

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

在查看documentation时,听起来像FileStream类仍然试图将整个文件读入内存(这对大文件不利)。

是否有更合适的类用于读取大文件?我真的想要一个缓冲的FileStream类,它只加载下一个要读取的文件中的字节。

我希望我可能需要编写一个为我做这个的类,但是我需要一次只读取一个文件。我假设我可以通过设置FileStream的position和readAhead属性来一次从文件中读取一个块。如果有一个这样的课程已经存在,我希望能节省一些时间。

有没有一种很好的方法来处理AS3中的大文件,而不将整个内容加载到内存中?

2 个答案:

答案 0 :(得分:3)

您可以使用fileStream.readAhead和fileStream.position属性来设置要读取的文件数据的数量,以及要从中读取文件的位置。

让我们说你只想读取兆字节152的千兆字节文件。做这个; (一个千兆字节的文件由1073741824字节组成) (Megabyte 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 \\  
}

答案 1 :(得分:2)

你不能创建一个流,并在给定的偏移处读取一块字节,一次读取一个块......所以:

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;
}

然后根据需要重复。我不知道它是如何工作的,并且没有测试过,但我的印象是它有效。