代码之家  ›  专栏  ›  技术社区  ›  Kekoa

AS3处理任意大文件

  •  3
  • Kekoa  · 技术社区  · 16 年前

    我试图在AS3中读取一个非常大的文件,但运行时出现了问题,这会使我崩溃。我正在使用 FileStream 异步打开文件。对于大于300MB的文件,这不起作用(无例外崩溃)。

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

    在看的时候 documentation 似乎filestream类仍在尝试将整个文件读取到内存中(这对大型文件不好)。

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

    我希望我可能需要编写一个这样做的类,但随后我将只需要一次读取一段文件。我假设可以通过设置文件流的position和readahead属性一次从文件中读取一个块来实现这一点。如果有这样一个类已经存在,我想节省一些时间。

    在AS3中,有没有一种好的方法可以在不将整个内容加载到内存中的情况下处理大型文件?

    2 回复  |  直到 11 年前
        1
  •  2
  •   alecmce    16 年前

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

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

    然后根据需要重复。我不知道这是如何工作的,也没有测试过,但我觉得这是可行的。

        2
  •  3
  •   Tom Solacroup FlashDictionary    11 年前

    可以使用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 \\  
    }