异步编程和以异步方式打开的 FileStream 对象所生成的事件

Adobe AIR 1.0 和更高版本

当以异步方式打开文件时(使用 openAsync() 方法),读取和写入文件是以异步方式执行的。在将数据读入读取缓冲区以及写入输出数据时,可以执行其他 ActionScript 代码。

这表示您需要注册由以异步方式打开的 FileStream 对象所生成的事件。

通过注册 progress 事件,当有新数据可供使用时您可以收到通知,如以下代码中所示:

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); 
var str:String = ""; 
 
function progressHandler(event:ProgressEvent):void  
{ 
    str += myFileStream.readMultiByte(myFileStream.bytesAvailable, "iso-8859-1"); 
} 

通过注册 complete 事件,您可以读取全部数据,如以下代码中所示:

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

就像输入数据将存储到缓冲区中以便可以执行异步操作一样,您在异步流上写入的数据也将存储到缓冲区中,然后以异步方式写入文件。随着数据写入文件,FileStream 对象将定期调度一个 OutputProgressEvent 对象。OutputProgressEvent 对象包括一个 bytesPending 属性,该属性设置为剩余的要写入的字节数。您可以注册 outputProgress 事件,以便当此缓冲区实际写入文件时收到通知,或者为了显示进度对话框。不过,通常情况下不需要这样做。具体而言,您可以调用 close() 方法,而不考虑未写入的字节。FileStream 对象将继续写入数据,当最后一个字节写入文件并且基础文件关闭后将传递 close 事件。