非同步程式設計與以非同步方式開啟之 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 事件。