2010-02-23 48 views
3

我想讀取AS3中的一個非常大的文件,並且遇到運行時出現問題而導致我崩潰。我目前使用FileStream來異步打開文件。對於大於300MB的文件,這不起作用(沒有異常時崩潰)。AS3使用任意大的文件

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

在看documentation,這聽起來像FileStream類仍試圖在整個文件到內存(這是壞對於大文件)來讀取。

是否有更合適的類用於讀取大文件?我真的想要像緩衝的FileStream類,只加載下一個將被讀取的文件中的字節。

我在期待我可能需要寫一個類來爲我做這件事,但那時我只需要一次只讀一段文件。我假設我可以通過設置FileStream的位置和readAhead屬性來一次讀取文件塊。如果有這樣的課程已經存在,我很樂意節省一些時間。

有沒有一種很好的方法來處理AS3中的大文件,而無需將全部內容加載到內存中?

回答

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

,然後根據需要重複。我不知道這是如何工作的,也沒有測試過,但我的印象是這樣的。

+0

這類似於我在想什麼,我自己做的實現的。我可能會實現額外的抽象層。 – Kekoa 2010-02-24 21:12:30

3

您可以使用fileStream.readAhead和fileStream.position屬性來設置要讀取的文件數據量以及要從中讀取文件的位置。

可以說你只想讀GB的文件的兆字節152。做這個; (A千兆字節文件由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 \\ 
}