我正在尝试在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中的大文件,而不将整个内容加载到内存中?
答案 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;
}
然后根据需要重复。我不知道它是如何工作的,并且没有测试过,但我的印象是它有效。