以非同步方式開啟檔案 (使用
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
事件。