读取缓冲区和 FileStream 对象的 bytesAvailable 属性

Adobe AIR 1.0 和更高版本

当打开具有读取功能的 FileStream 对象时(在该对象中, open() openAsync() 方法的 fileMode 参数设置为 READ UPDATE ),运行时将数据存储在内部缓冲区中。当您打开文件后,FileStream 对象立即开始将数据读取到缓冲区中(通过调用 FileStream 对象的 open() openAsync() 方法)。

对于打开执行同步操作的文件(使用 open() 方法),您始终可以设置 position 指针指向任何有效位置(在文件的范围内),并开始读取任何数量的数据(在文件的范围内),如以下代码中所示(假定该文件包含至少 100 个字节):

var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.open(myFile, FileMode.READ); 
myFileStream.position = 10; 
myFileStream.readBytes(myByteArray, 0, 20); 
myFileStream.position = 89; 
myFileStream.readBytes(myByteArray, 0, 10);   

无论打开文件进行同步操作还是异步操作,读取方法始终从由 bytesAvalable 属性表示的“可用”字节读取。当以同步方式读取时,任何时间文件的所有字节都是可用的。当以异步方式读取时,在由 progress 事件指示的一系列异步缓冲区填充数据中,从 position 属性指定的位置开始的字节是可用的。

对于打开进行 同步 操作的文件, bytesAvailable 属性始终设置为表示从 position 属性到文件结尾的字节数(文件中所有字节始终是可以读取的)。

对于打开进行 异步 操作的文件,您需要确保在调用读取方法之前读取缓冲区已包含了足够的数据。对于以异步方式打开的文件,随着读取操作的进行,文件中从读取操作开始时指定的 position 开始的数据将添加到缓冲区,每读取一个字节 bytesAvailable 属性增加一。 bytesAvailable 属性指示从 position 属性指定的位置的字节开始到缓冲区结尾的可用字节数。FileStream 对象定期发送一个 progress 事件。

对于以异步方式打开的文件,随着数据在读取缓冲区中可用,FileStream 对象定期调度 progress 事件。例如,当数据读取到缓冲区时,以下代码将把该数据读取到 ByteArray 对象 bytes 中:

var bytes:ByteArray = new ByteArray(); 
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
myFileStream.openAsync(myFile, FileMode.READ); 
 
function progressHandler(event:ProgressEvent):void  
{ 
    myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable); 
} 

对于以异步方式打开的文件,只能读取读取缓冲区中的数据。而且,当您读取数据后,它即从读取缓冲区中删除。对于读取操作,您需要确保在调用读取操作之前数据在读取缓冲区中存在。例如,以下代码读取文件中从位置 4000 开始的 8000 个字节:

var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
myFileStream.addEventListener(Event.COMPLETE, completed); 
myFileStream.openAsync(myFile, FileMode.READ); 
myFileStream.position = 4000; 
 
var str:String = ""; 
 
function progressHandler(event:Event):void  
{ 
    if (myFileStream.bytesAvailable > 8000 ) 
    { 
        str += myFileStream.readMultiByte(8000, "iso-8859-1"); 
    } 
} 

在写入操作过程中,FileStream 对象不会将数据读入读取缓冲区中。当写入操作完成后(写入缓冲区中所有数据都已写入文件),FileStream 对象启动一个新的读取缓冲区(假定关联的 FileStream 对象已打开并具有读取功能),并开始将从 position 属性指定的位置开始的数据读入读取缓冲区中。 position 属性可以是写入的最后一个字节的位置,也可以是其他位置(如果在写入操作后用户为 position 对象指定了其他值)。